SQLAlchemy:表已经存在

时间:2012-08-10 11:17:45

标签: python 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次)

4 个答案:

答案 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)

这是我对一些故障排除想法的猜测。我的猜测是客户端认为该表不存在,因为它无法看到它,但在尝试创建它时,不能,因为它实际上确实存在。

疑难解答:

  • 检查代码的其他部分是否正在写入同一个日志文件或其他任何内容并尝试创建这些表。
  • 使用与客户端相同的ID和密码手动登录,看看是否可以看到 表
  • 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