SQLAlchemy提示“表已存在”,但实际上并没有

3 投票
1 回答
2343 浏览
提问于 2025-04-17 13:52

我想用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.3MySQL 5.1.47SQLAlchemy 0.8.0b2

附言:使用Postgres时,我从未遇到过这样的问题。

1 个回答

1

我通过升级到 MySQL 5.1.66 解决了这个问题。需要注意的是,我不是简单地升级旧版本,而是把旧的完全卸载了,然后从头开始安装新的版本。所以我现在也不太确定问题是因为我之前的安装配置不对,还是单纯的一个bug。

不过,现在一切都正常了。

撰写回答