我正在使用
psql
13.4 来制作 pg_dump
数据库。我只需要所有表的架构(无数据),除了一个枚举引用表(我需要该表的数据)。我看到 pg_dump
有一个支持正则表达式模式的 --exclude-table-data
标志。但它没有 --include-table-data
标志。
因此,为了排除除单个引用表之外的所有表的表数据,我认为我可以使用具有负向前瞻性的正则表达式。例如这个:
^(?!.*(reference_table_name))
。然而,由于 psql 的特殊字符限制(例如,*
、?
和.
),这似乎不起作用,如here所述。我尝试进行它建议的替换,但不起作用。
我想做的事情可能吗?
我还尝试从转储中的表中排除数据,除了使用具有不同正则表达式变体的
--exclude-table-data
参数的数据外,但当您指出 ?
字符的限制时,甚至根据 https: //stackoverflow.com/a/29232803/2754392这是不可能的。
FWIW,这实际上可以使用此上下文中可用的受限正则表达式来完成 - 但您是否真的想这样做是另一回事,因为它不是很漂亮。
也就是说,要排除除
sometable
以外的所有表的数据,你必须这样写:
(|[^s]*|s(|[^o]*|o(|[^m]*|m(|[^e]*|e(|[^t]*|t(|[^a]*|a(|[^b]*|b(|[^l]*|l(|[^e]*|e?*)))))))))
这个怪物是如何产生的?理解它的关键是它是由以下原子组成的:
(|[^s]*|s*)
此替换将匹配以下其中一项:
因此,这个构造本身相当于
*
并且可以匹配任何内容。然而,通过分离案例,它创建了一个钩子,可以将条件添加到其中的任何一个。现在让我们稍微改变一下积极的情况:
(|[^e]*|e?*)
现在,只有当后面至少有一个字符时,正例才匹配字符“e”。所以这将匹配几乎任何东西:除了仅由“e”组成的字符串之外的任何东西。
现在我们采用其中两种模式,各一种:
(|[^l]*|l*)
(|[^e]*|e?*)
…我们通过将第一个模式的
*
替换为第二个模式来限制第一个模式的正向情况(与“e”后跟任何内容匹配),即我们将“任何内容”替换为“除了‘e’之外的任何内容” :
(|[^l]*|l(|[^e]*|e?*))
现在我们有了一个模式,它总共可以匹配以下内容:
…这意味着该模式匹配除
le
之外的任何字符串。现在我们通过基本模式的另一个实例进行迭代:
(|[^b]*|b*)
(|[^l]*|l(|[^e]*|e?*))
...并重复相同的替换:
(|[^b]*|b(|[^l]*|l(|[^e]*|e?*)))
与之前相同,它匹配除
ble
之外的任何字符串。
所以。让我们从同一图案的一系列副本开始:
(|[^s]*|s*)
(|[^o]*|o*)
(|[^m]*|m*)
(|[^e]*|e*)
(|[^t]*|t*)
(|[^a]*|a*)
(|[^b]*|b*)
(|[^l]*|l*)
(|[^e]*|e?*)
将它们折叠在一起会产生我在开始时给出的模式 - 因此,该模式可以匹配除
sometable
之外的任何字符串。
这就是你可以做到的。这取决于你是否真的“想要”。也许在代码旁边的注释中添加指向此答案的链接会使其更合理......