web-dev-qa-db-fra.com

Exécuter le schéma .sql dans psycopg2 dans Python

J'ai un schéma PostgreSQL stocké dans un fichier .sql. Cela ressemble à quelque chose comme:

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
);

Comment dois-je exécuter ce schéma après la connexion à la base de données?

Mon code Python fonctionne pour les bases de données 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())

Mais le psycopg2 n'a pas de méthode executescript sur le curseur. Alors, comment puis-je y parvenir?

23
linkyndy

Vous pouvez simplement utiliser execute:

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

bien que vous souhaitiez définissez d'abord psycopg2 sur le mode autocommit afin que vous puissiez utiliser la gestion des transactions du script.

Ce serait bien si psycopg2 offrait un mode plus intelligent où il lisait le fichier dans une déclaration à la fois et l'envoyait à la base de données, mais à l'heure actuelle, il n'y a pas un tel mode à ma connaissance. Il aurait besoin d'un analyseur assez solide pour le faire correctement face à $$ citant (et son $delimiter$ variante où le deimiter peut être n'importe quel identifiant), standard_conforming_strings, E'' chaînes, corps de fonction imbriqués, etc.

Notez que cela ne fonctionnera pas avec:

  • tout ce qui contient psql commandes antislash
  • COPIE .. DE STDIN
  • entrée très longue

... et ne fonctionnera donc pas avec les vidages de pg_dump

52
Craig Ringer

Je ne peux pas répondre aux commentaires de la réponse sélectionnée par manque de réputation, donc je vais faire une réponse pour aider avec le problème COPY.

Selon le volume de votre base de données, pg_dump --inserts affiche INSERTs au lieu de COPYs

9
Lisael