SQLAlchemy提示“表已存在”,但实际上并没有
我想用SQLAlchemy这个工具,不仅用来查询数据库,还想用它来创建表格。所以我先连接到我数据库的空架构:
engine = create_engine(connection_string)
Base = declarative_base()
我有几个类,它们看起来像下面这个例子:
class SomeClass(Base):
__tablename__= 'SomeClass'
id = Column(Integer, primary_key=True, auto_increment=True)
name = Column(String(50))
def __init__(self, name):
self.name = name
为了创建数据库,我调用:
Base.metadata.create_all(engine)
这第一次运行得很好。如果我现在手动从数据库中删除表格,或者调用Base.metadata.drop_all()
,然后重启脚本(也就是再次调用create_all
),我就会收到一个错误,提示我的表格已经存在:
sqlalchemy.exc.OperationalError: (OperationalError) (1050, "Table 'someclass' already exists")
我可以明确地说,这不是真的。我可以通过我的命令行工具使用CREATE TABLE命令创建一个同名的表格,并且如果我现在停止这个数据库守护进程,再重新启动它,我就能再次使用create_all
创建表格。
所以我猜这可能和SQLAlchemy与数据库之间的连接有关。显然,SQLAlchemy认为我删除的表格仍然存在,这显然是不对的。但是如果我尝试查询这个不存在的表格,它会告诉我,这个表格不存在。
我在网上查了很多,但没能找到这个行为的解释。我不常用SQLAlchemy,所以可能对它了解得不够深入,无法理解这个问题。
无论如何,我会很感激能得到一些提示。
我使用的是Python 2.7.3、MySQL 5.1.47和SQLAlchemy 0.8.0b2
附言:使用Postgres时,我从未遇到过这样的问题。
1 个回答
1
我通过升级到 MySQL 5.1.66 解决了这个问题。需要注意的是,我不是简单地升级旧版本,而是把旧的完全卸载了,然后从头开始安装新的版本。所以我现在也不太确定问题是因为我之前的安装配置不对,还是单纯的一个bug。
不过,现在一切都正常了。