如何在 pg_dump 中使用 --exclude-table-data 标志来匹配除一个表之外的所有表?

问题描述 投票:0回答:2

我正在使用

psql
13.4 来制作
pg_dump
数据库。我只需要所有表的架构(无数据),除了一个枚举引用表(我需要该表的数据)。我看到
pg_dump
有一个支持正则表达式模式的
--exclude-table-data
标志。但它没有
--include-table-data
标志。

因此,为了排除除单个引用表之外的所有表的表数据,我认为我可以使用具有负向前瞻性的正则表达式。例如这个:

^(?!.*(reference_table_name))
。然而,由于 psql 的特殊字符限制(例如,
*
?
.
),这似乎不起作用,如here所述。我尝试进行它建议的替换,但不起作用。

我想做的事情可能吗?

regex postgresql psql pg-dump
2个回答
1
投票

我还尝试从转储中的表中排除数据,除了使用具有不同正则表达式变体的

--exclude-table-data
参数的数据外,但当您指出
?
字符的限制时,甚至根据 https: //stackoverflow.com/a/29232803/2754392这是不可能的。


0
投票

FWIW,这实际上可以使用此上下文中可用的受限正则表达式来完成 - 但您是否真的想这样做是另一回事,因为它不是很漂亮。

也就是说,要排除除

sometable
以外的所有表的数据,你必须这样写:

(|[^s]*|s(|[^o]*|o(|[^m]*|m(|[^e]*|e(|[^t]*|t(|[^a]*|a(|[^b]*|b(|[^l]*|l(|[^e]*|e?*)))))))))

这个怪物是如何产生的?理解它的关键是它是由以下原子组成的:

(|[^s]*|s*)

此替换将匹配以下其中一项:

  • 没什么
  • 除“s”之外的任何字符,后跟任何内容(我们称之为否定情况)
  • 字符“s”,后跟任何内容(正例)

因此,这个构造本身相当于

*
并且可以匹配任何内容。然而,通过分离案例,它创建了一个钩子,可以将条件添加到其中的任何一个。现在让我们稍微改变一下积极的情况:

(|[^e]*|e?*)

现在,只有当后面至少有一个字符时,正例才匹配字符“e”。所以这将匹配几乎任何东西:除了仅由“e”组成的字符串之外的任何东西。

现在我们采用其中两种模式,各一种:

(|[^l]*|l*)
(|[^e]*|e?*)

…我们通过将第一个模式的

*
替换为第二个模式来限制第一个模式的正向情况(与“e”后跟任何内容匹配),即我们将“任何内容”替换为“除了‘e’之外的任何内容” :

(|[^l]*|l(|[^e]*|e?*))

现在我们有了一个模式,它总共可以匹配以下内容:

  • 没什么
  • 除“l”之外的任何字符,后跟任何内容
  • 字符“l”后面什么都没有
  • 字符“l”,然后是除“e”之外的任何字符,后面跟任何内容
  • 字符“l”然后“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
之外的任何字符串。

这就是你可以做到的。这取决于你是否真的“想要”。也许在代码旁边的注释中添加指向此答案的链接会使其更合理......

© www.soinside.com 2019 - 2024. All rights reserved.