【问题标题】:Regular expression for removing Postgres SQL data insert (COPY) statements.用于删除 Postgres SQL 数据插入 (COPY) 语句的正则表达式。
【发布时间】:2013-08-01 14:30:16
【问题描述】:

我的 postgres 转储 (pg_dump > file.sql) 包含我要删除的数据。是否有一个简单的正则表达式(或 sed/awk 命令)来删除特定 COPY table_name 语句和终止词(“。”)之间的所有行。我知道正则表达式对于不匹配和多行模式并不理想,但我还是尝试了这些(在崇高的查找/替换中):

"COPY ((?!\\[.])*.*)*"

"COPY ((?!\\[.]$)*(.[\n])*)*"

"COPY (?!\\[.]$)(.*[\n]*)*"

我能得到的最接近的是匹配复制语句后的第一行数据:

"COPY (?!\\[.]$).*[\n]+.*[\n]+"

【问题讨论】:

  • 为什么不使用pg_dump 参数从转储中排除表数据?
  • 不知道可以在不排除表架构的情况下排除表数据。我想我应该 RTD 多一点,看看 --schema-only 和“--data-only”和表排除的某种组合是否可以解决问题。

标签: sql regex postgresql replace sublimetext


【解决方案1】:

通常,您可能希望执行以下操作(请注意,在某些情况下,这会导致外键依赖项出现一些问题:

pg_dump -s mydatabase > dump.sql
pg_dump -a -t table_i_want1 -t table_i_want2 -t table_i_want3 >> dump.sql

-s 标志表示--schema-only,-a 标志告诉它“追加”(即仅数据)。

【讨论】:

  • 是的,感谢您的明确回答。这就是我一直在寻找的。那么外键在重新加载这个转储时会失败吗?
  • 按顺序指定您的 -t 表,以免它们失败。在这种情况下,由您来管理该订单。在我的测试中,这些都是以相反的顺序完成的。在 9.2 及更高版本中,您可能会发现 --section=data 更好,实际上您可以单独转储所有三个部分并重新加载,如果您愿意,可能会省略数据,这也可以解决问题(因为会创建 fkeys在这种情况下加载数据后)。
  • 优秀。感谢您的调查和测试。
猜你喜欢
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2013-11-16
相关资源
最近更新 更多