2012-08-10 89 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)