在 Python 中的 psycopg2 中执行 .sql 模式

Posted

技术标签:

【中文标题】在 Python 中的 psycopg2 中执行 .sql 模式【英文标题】:Execute .sql schema in psycopg2 in Python 【发布时间】:2013-06-20 02:36:59 【问题描述】:

我有一个存储在 .sql 文件中的 PostgreSQL 架构。它看起来像:

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    facebook_id TEXT NOT NULL,
    name TEXT NOT NULL,
    access_token TEXT,
    created INTEGER NOT NULL
);

连接数据库后如何运行这个架构?

我现有的 Python 代码适用于 SQLite 数据库:

# Create database connection
self.connection = sqlite3.connect("example.db")

# Run database schema
with self.connection as cursor:
    cursor.executescript(open("schema.sql", "r").read())

但是 psycopg2 在光标上没有 executescript 方法。那么,我该如何实现呢?

【问题讨论】:

【参考方案1】:

你可以使用execute:

with self.connection as cursor:
    cursor.execute(open("schema.sql", "r").read())

虽然你可能想set psycopg2 to autocommit mode first 这样你就可以使用脚本自己的事务管理。

如果 psycopg2 提供一种更智能的模式,它可以一次读取一个语句中的文件并将其发送到数据库,那就太好了,但据我所知,目前还没有这种模式。当遇到$$ 引用(以及它的$delimiter$ 变体,其中分隔符可以是任何标识符)、standard_conforming_stringsE'' 字符串、嵌套函数体等时,它需要一个相当可靠的解析器才能正确执行。

请注意,这适用于:

任何包含psql 反斜杠命令的内容 从标准输入复制.. 非常很长的输入

...因此不适用于来自pg_dump的转储

【讨论】:

Craig,psql 在输入多语句字符串时会做什么?它是否有自己的解析器来检测何时 a ;是语句分隔符还是只是字符串/注释的一部分? @piro: 是的,psql 可以使用-f 开关解析完整的 SQL 文件。来自psql --help的输出:-f, --file=FILENAME execute commands from file, then exit @Matt3o12 It's not a memory leak; I think you need to look up what that actually means。它可能使用大量 RAM 并耗尽可用内存,是的。这是一个玩具示例,当然你不会用大脚本做这么简单的事情。您将使用psql,自己解析和拆分输入以提供给psycopg2,等等。 @Matt3o12 据我所知,没有具体名称。我只想说“该代码可能会耗尽大量输入的 RAM,因为它将整个输入加载到 RAM 中,而不是流式传输或逐步处理它”。 内存泄漏是一个非常具体的术语,人们经常滥用这个术语,所以有点令人沮丧;-) @sudo COPY 需要特殊处理,不能仅作为普通查询发送。 psycopg2 支持复制,但您必须提取复制查询和数据并单独处理。【参考方案2】:

由于缺乏声誉,我无法回复所选答案的 cmets,所以我会回答以帮助解决 COPY 问题。

根据您的数据库容量,pg_dump --inserts 输出 INSERTs 而不是 COPYs

【讨论】:

以上是关于在 Python 中的 psycopg2 中执行 .sql 模式的主要内容,如果未能解决你的问题,请参考以下文章

psycopg2“选择更新”

使用 psycopg2 在 python 中执行查询时出现“ProgrammingError:在或附近出现语法错误”

python:2.7-alpine 在 Docker 中的 psycopg2 安装

从执行存储过程的psycopg2游标中获取列名列表?

Django 在执行 python manage.py runserver-“raise ImproperlyConfigured("Error loading psycopg2 modul

无法使用 Psycopg2 在 Amazon Redshift 中创建表