我们什么时候在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 :(得分:18)
只需使用架构对象的(表格,索引和序列) 创建和放置方法 checkfirst = True 关键字和表会自动添加“IF NOT EXISTS或IF EXISTS CLAUSE”,以适用于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)
答案 1 :(得分:2)
如果foobar表已经存在,你可以改为:
users = Table('foobar', metadata, autoload=True)
并且SQLAlchemy会自动从数据库中找出表的结构。
首先使用自动加载检查,表是否存在,如果不存在则创建表。
答案 2 :(得分:1)
这是我对一些故障排除想法的猜测。我的猜测是客户端认为该表不存在,因为它无法看到它,但在尝试创建它时,不能,因为它实际上确实存在。
疑难解答:
echo=True
传递给create_engine
以了解客户端执行的确切查询,然后重复您自己的SQL shell中的所有查询,以查看客户端看到的内容。希望这会引导你得出结论。答案 3 :(得分:0)
另一个选择是使用元数据:
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