查询PostgreSQL转储中的数据

时间:2016-06-05 04:29:50

标签: python postgresql

我有一个由PostgreSQL数据库生成的转储。我想检查该转储中的一些信息,特别是检查某个表中是否存在某些字段中具有某些值的条目。

这适用于应该在客户机器上的许多不同输入上自动运行的Python程序,因此我需要一个程序化解决方案,而不是手动打开文件并查找该表的定义位置。我可以将转储恢复到数据库然后删除它,但我担心这个操作很重或者有副作用。我希望我的查询没有任何副作用,我只想做检查而不影响我的系统中的任何内容。

这有可能吗?最好是在Python?

3 个答案:

答案 0 :(得分:1)

将数据库转储为CSV文件(或每个表的CSV文件),然后您可以使用pandas加载和查询它们。

答案 1 :(得分:1)

任何转储格式:还原和查询

最实际的做法是将它们恢复到临时PostgreSQL数据库,然后查询数据库。它是迄今为止最简单的选择。如果您拥有拥有createdb权限的非超级用户,则可以使用pg_restore轻松安全地执行此操作。

SQL格式

如果它是纯文本(.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)

您可以使用我编写的这个小工具将转储转换为INSERT INTO转储:

https://github.com/freddez/pg-dump2insert

以这种形式grep特定表数据会更容易。