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

vbkedwbf  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(318)

我正在使用psql 13.4来创建一个pg_dump数据库。我只需要所有表的模式(没有数据),除了一个枚举引用表,我需要它的数据。我看到pg_dump有一个支持正则表达式模式的--exclude-table-data标志。但它没有--include-table-data标志。
因此,为了排除除了单个引用表之外的所有表的表数据,我想我可以使用一个带有负前瞻的正则表达式。例如这个:^(?!.*(reference_table_name))。但是由于psql的特殊字符限制(例如,在*?.上)。我试着做了它建议的替代品,但它不起作用。
我想做的事有可能吗?

qyyhg6bp

qyyhg6bp1#

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”only,如果后面至少有一个字符。所以这个模式几乎可以匹配任何东西:除了字符串e之外的任何字符串。
现在我们取两个这样的图案,每个图案一个:

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

.我们通过用第二种模式替换它的*来限制第一种模式的正情况,即我们把“an 'l'后跟anything”替换为“anything”,“anything”替换为“anything except just an '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之外的任何字符串的模式。
这就是你能做到的。这取决于你是否真的想要。也许在代码旁边的注解中放置一个指向这个答案的链接会使它更合理。

0dxa2lsx

0dxa2lsx2#

我还尝试从转储中的表中排除数据,除了一个使用--exclude-table-data参数和正则表达式的不同变体的表,但是当您指出?字符的限制时,即使根据https://stackoverflow.com/a/29232803/2754392,这似乎也是不可能的。

相关问题