Выполнить.sql-схему в psycopg2 в Python

У меня есть 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 метод на курсоре. Итак, как я могу это достичь?

Ответ 1

Вы можете просто использовать execute:

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

хотя вы можете установить psycopg2 в autocommit режима первого, так что вы можете использовать скрипт собственного управления транзакциями.

Было бы неплохо, если psycopg2 предложил более умный режим, когда он читал файл в инструкции по времени и отправлял его в БД, но в настоящее время нет такого режима, насколько я знаю. Для корректного выполнения этого вопроса понадобился бы достаточно сильный парсер, когда он столкнулся с $$ quoting (и его $delimiter$ -граничным $delimiter$ -разделом, где разделителем может быть любой идентификатор), standard_conforming_strings, строки E'' строками вложенных функций и т.д.

Обратите внимание, что это не сработает:

  • что-либо содержащее команды psql backslash
  • КОПИРОВАНИЕ.. ИЗ СТДИН
  • очень длинный ввод

... и поэтому не будет работать с дампами из pg_dump

Ответ 2

Я не могу ответить на комментарии выбранного ответа из-за отсутствия репутации, поэтому я сделаю ответ, чтобы помочь с проблемой COPY.

В зависимости от объема вашей БД, pg_dump --inserts выводит INSERT вместо COPY