[英]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 會自動從數據庫中找出表的結構。
首先使用自動加載檢查表是否存在,如果不存在則創建表。
這是我的一些故障排除想法的猜測。 我的猜測是客戶認為該表不存在,因為它看不到它,但在嘗試創建它時卻不能,因為它實際上確實存在。
故障處理思路:
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.