2013-06-23 26 views
14

我有一個存儲在.sql文件中的PostgreSQL模式。它看起來像這樣:在Python中執行psycopg2中的.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方法。那麼,我怎麼能做到這一點?

回答

38

你可以用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反斜線任何命令
  • COPY ..從標準輸入
  • 非常長的輸入

...,因此不會與轉儲從pg_dump

+0

謝謝!它的工作原理 – linkyndy

+0

Craig,psql在提供多語句字符串時做了什麼?它有它自己的解析器來檢測何時;是語句分隔符還是字符串/註釋的一部分? – piro

+0

@piro:是的,'psql'可以使用'-f'開關解析完整的SQL文件。從'psql --help'輸出:'-f,--file = FILENAME從文件執行命令,然後退出'。 –

6

工作,我不能沒有信譽的回覆所選答案的評論,所以我會作出回答幫助COPY問題。

根據你的數據庫的體積,pg_dump --inserts輸出INSERT!而非COPY小號