簡體   English   中英

SQLAlchemy:表已經存在

[英]SQLAlchemy: Table already exists

我們通常什么時候在 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 次)

只需使用帶有checkfirst=True關鍵字的模式對象(表、索引和序列)創建刪除方法,表將自動添加適合 SQL 的“IF NOT EXISTS 或 IF EXISTS CLAUSE”

例如:

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)

如果 foobar 表已經存在,你可以這樣做:

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

SQLAlchemy 會自動從數據庫中找出表的結構。

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

這是我的一些故障排除想法的猜測。 我的猜測是客戶認為該表不存在,因為它看不到它,但在嘗試創建它時卻不能,因為它實際上確實存在。

故障處理思路:

  • 檢查代碼的其他部分是否正在寫入同一個日志文件或其他任何內容,並試圖創建這些表。
  • 用和客戶端相同的ID和密碼手動登錄,看能不能看到表。
  • echo=True傳遞給create_engine以了解客戶端執行的確切查詢,然后在您自己的 SQL shell 中重復所有查詢以查看客戶端正在看到的內容。 希望這會讓您得出結論。

另一種選擇是使用元數據:

database_engine = create_engine(
    'mssql+pyodbc://username:password=@server:1433/databaseName?driver=ODBC+Driver+17+for+SQL+Server?trusted_connection=no')
with database_engine.connect() as database_connection:
    metaData = MetaData(bind=database_engine, reflect=True)
    metaData.reflect()

    try:
        Table("tbl_stuff",
              metaData,
              Column("id", Integer, primary_key=True, autoincrement=False),
              Column("Name", String(255)),
              extend_existing=True)
        metaData.create_all(database_connection, checkfirst=True)
        metaData.reflect()
    except Exception as an_exc:
        logging.exception("Exception creating tbl_stuff: " + str(an_exc))

有關詳細信息,請參閱https://docs.sqlalchemy.org/en/13/core/metadata.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM