2012-08-10 91 views
4

什麼時候我們通常會在SQLAlchemy中出現以下錯誤?SQLAlchemy:表已存在

sqlalchemy.exc.OperationalError: (OperationalError) (1050, "Table 'foobar' already exists") 

foobar表確實已經存在,但爲什麼SQLAlchemy的嘗試時,已經存在創建表。我假設它不應該創建表,如果已經存在。

我使用以下語法創建表:

t = Table('foobar', metadata, 
     Column('col1', String(50), primary_key=True), 
     Column('col2', String(100)), 
     mysql_engine='InnoDB', 
     mysql_charset='utf8') 

(我打電話是平行的10倍相同的程序)

+0

我假定你有可能給一段代碼向我們展示你所使用的方法,但最終你碰巧有外鍵在T臺還是你碰巧有外鍵引用col1或t表上的任何其他列?我有一個類似的問題,我認爲這涉及到參照完整性。 – sederek 2012-12-06 21:41:47

+0

我使用'checkfirst'參數,但仍然出現'Table already exists'錯誤。請注意,我正在使用python的多處理池功能。看起來這應該不重要。 – user3731622 2017-02-09 23:08:37

回答

1

如果foobar的表已經存在,你可以改爲做了:

users = Table('foobar', metadata, autoload=True) 

和SQLAlchemy會自動從數據庫中計算出表的結構。

首先使用自動加載進行檢查,表是否存在,如果不存在,則創建表。

+0

如果表格不存在?如果我們想在第一次運行時創建表,我不認爲只傳遞'autoload'參數。 – abhiomkar 2012-08-10 11:29:14

+0

難道你不先檢查,表是否存在或沒有使用自動加載,它不存在然後使用你的語法創建表? – 2012-08-10 11:44:28

+1

Column構造函數的Column對象與沒有'autoload'選項的現有表結構相同。在SQLAlchemy中,不需要檢查表是否已經存在。當我通過cron作業運行腳本時,我遇到了上面的'OperationalError'。只是想知道可能會導致這個問題。 – abhiomkar 2012-08-10 12:10:28

1

這是我的一些疑難解答想法。我的猜測是客戶端認爲該表不存在,因爲它不能看到它,但是當試圖創建它時,不能因爲它實際上存在。

故障診斷思路:

  • 檢查,看是否可能在代碼的其他部分被寫入同一個日誌文件或什麼,並試圖創建這些表。
  • 使用與客戶端相同的ID和密碼手動登錄,並查看是否可以看到 表。
  • 通過echo=Truecreate_engine來了解客戶端執行的確切查詢,然後在您自己的SQL shell中重複所有查詢以查看客戶端正在查看的內容。希望這會讓你得出結論。
14

只要使用模式對象的(表,索引和序列)創建下降方法與checkfirst =真關鍵字和表格會自動添加一個「IF NOT EXISTS或IF EXISTS條款「適用於SQL。

例如:

t = Table('foobar', metadata, 
    Column('col1', String(50), primary_key=True), 
    Column('col2', String(100)), 
    mysql_engine='InnoDB', 
    mysql_charset='utf8') 

t.create(checkfirst=True)