40

我有一个存储在 .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())

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

4

2 回答 2

75

您可以使用execute

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

尽管您可能想先将psycopg2 设置为autocommitmode以便您可以使用脚本自己的事务管理。

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

请注意,这不适用于:

  • 任何包含psql反斜杠命令的东西
  • 复制..从标准输入
  • 长的输入

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

于 2013-06-23T14:20:28.087 回答
10

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

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

于 2016-02-11T14:22:18.777 回答