2013-06-23 9 views
14

Mam schemat PostgreSQL przechowywany w pliku .sql. Wygląda to tak:Wykonanie schematu .sql w psycopg2 w Pythonie

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

Jak uruchomić ten schemat po połączeniu się z bazą danych?

Moje istniejący kod Python działa dla baz danych 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()) 

Ale psycopg2 nie ma executescript metodę na kursora. Jak mogę to osiągnąć?

Odpowiedz

38

można po prostu użyć execute:

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

choć może chcesz set psycopg2 to autocommit mode first więc można użyć własnego zarządzanie transakcjami skryptu.

Byłoby miło, gdyby psycopg2 zaoferował inteligentniejszy tryb, w którym odczytał plik w oświadczeniu w czasie i wysłał go do DB, ale obecnie nie ma takiego trybu, o ile wiem. Byłoby trzeba dość solidną parser zrobić to poprawnie w obliczu $$ przytoczyć (i jego $delimiter$ wariantu gdzie deimiter może być dowolny identyfikator), standard_conforming_strings, E'' strun, zagnieżdżonych organy funkcjonują, itp

pamiętać, że będzie nie praca z:

  • cokolwiek zawierający psql backslash poleceń
  • KOPIA .. ze standardowego wejścia
  • bardzo długo wejście

... i dlatego nie będzie działać z wysypisk z pg_dump

+0

Dziękujemy! Działa – linkyndy

+0

Craig, co robi psql przy podawaniu ciągu wielowyrazowego? Ma własny parser, który wykrywa, kiedy; jest ogranicznikiem instrukcji lub po prostu częścią ciągu/komentarza? – piro

+0

@piro: tak, 'psql' może parsować pełne pliki SQL za pomocą przełącznika' -f'. Z wyjścia 'psql --help':' -f, --file = NAZWA_PLIKU uruchamia polecenia z pliku, a następnie kończy pracę '. –

6

Nie mogę odpowiadać na komentarze wybranego odpowiedź brakiem reputacji, więc zrobię odpowiedź pomoc w numerze COPY.

zależności od wielkości swojej DB, pg_dump --inserts wyjścia INSERT S zamiast COPY s