我有一个由PostgreSQL数据库生成的转储。我想检查该转储中的一些信息,特别是检查某个表中是否存在某些字段中具有某些值的条目。
这适用于应该在客户机器上的许多不同输入上自动运行的Python程序,因此我需要一个程序化解决方案,而不是手动打开文件并查找该表的定义位置。我可以将转储恢复到数据库然后删除它,但我担心这个操作很重或者有副作用。我希望我的查询没有任何副作用,我只想做检查而不影响我的系统中的任何内容。
这有可能吗?最好是在Python?
答案 0 :(得分:1)
将数据库转储为CSV文件(或每个表的CSV文件),然后您可以使用pandas加载和查询它们。
答案 1 :(得分:1)
最实际的做法是将它们恢复到临时PostgreSQL数据库,然后查询数据库。它是迄今为止最简单的选择。如果您拥有拥有createdb
权限的非超级用户,则可以使用pg_restore
轻松安全地执行此操作。
如果它是纯文本(.sql)格式转储,如果绝望并且您知道转储是而不是使用--inserts
或--column-inserts
选项创建的不要在多个模式中使用相同的表名,您只需搜索文本
COPY tablename (
在一行的开头,然后阅读COPY
- 格式数据(见下文),直到您在行的开头找到\.
。
如果执行在不同的模式中使用相同的表名,则必须解析转储以查找所需模式的SET search_path
条目,然后开始查找所需的表{ {1}}陈述。
但是,如果转储位于PostgreSQL custom format,您应该总是喜欢并使用COPY
-Fc
进行请求,那么IIRC实际上是一个带有自定义标头的tar文件。您可以在其中查找tar标题然后将其解压缩,或者您可以使用pg_dump
列出其标题,然后提取单个表。
为了完成这项任务,我要做后者。列出转储中的表:
pg_restore
以特定于表格的pg_restore --list out.dump
格式将特定表格转储为限定名称,例如架构COPY
中的表address
:
public
输出有很多东西,你不能在开始时跳过pg_restore -n public -t address out.dump
,但是你的脚本只能在一开始就查找单词pg_restore
(大写)行并在下一行开始阅读,直到它在行尾达到COPY
。有关格式的详细信息,请参阅the PostgreSQL manual on COPY
当然,您需要\.
二进制文件。
确保在调用pg_restore
时没有设置PGDATABASE
环境变量。否则它将恢复到DB而不是将输出打印到stdout。
答案 2 :(得分:0)