我在中存储了一个PostgreSQL模式.sql文件.它看起来像:

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方法.那么,我怎样才能做到这一点呢?

推荐答案

你只需使用execute:

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

尽管你可能想要set psycopg2 to autocommit mode first,这样你就可以使用脚本自己的事务管理了.

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

请注意,这将适用于:

  • 任何包含psql个反斜杠命令的命令
  • 复制来自STDIN
  • very长输入

... 因此无法处理pg_dump的转储

Postgresql相关问答推荐

PostgreSQL按描述请求

我需要一个变量来引用上周的星期五

使用postgres在go测试容器中使用tern迁移

docker-compose.yml用于使用postgres的spring-boot应用程序

执行准备好的语句不返回数据

无法将 json 范围读取为 pgtype.Int4range

安装age-installation时出错

使用psql的copy语句时如何压缩数据?

我在try 访问我的数据库表时在 postgresql 中收到 aclcheck_error 错误

使用 postgresql Select 整数作为位和状态表

消除 PostgreSQL SELECT 语句中的重复行

Docker - 判断 postgres 是否准备好

PostgreSQL:根据排序顺序仅 Select 每个 id 的第一条记录

INSERT RETURNING 是否保证以 right的顺序返回?

如何使用字符串作为 PostgreSQL 咨询锁的键?

当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是否成功?

从长时间的postgres转换日期

使用 RPostgreSQL 写入特定模式

pg_restore 会覆盖现有的表吗?

PostgreSQL:从转储中恢复数据库 - 语法错误