我想使用SQLAlchemy ORM不仅可以查询数据库,还可以创建表。所以我连接到我的数据库的空模式:
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")
我可以清楚地说,这不是真的。我能够使用CLI工具中的CREATE TABLE创建一个具有相同名称的表,并且如果我现在停止 数据库守护程序并再次启动它,我将能够使用create_all
再次创建表格。
所以我猜这与SQLAlchemy和数据库之间的连接有关。显而易见,SQLAlchemy认为该表在删除后仍然存在,但事实并非如此。但是,如果我尝试查询这个没有现有的表,它会告诉我,该表不存在。
我用Google搜索,但无法找到此行为的解释。我不经常使用SQLAlchemy,所以也许我根本没有深入到它,以了解问题。
无论如何,我很感激能得到一个提示。
我使用 Python 2.7.3 和 MySQL 5.1.47 和 SQLAlchemy 0.8.0b2
PS:使用Postgres我从未遇到过这样的问题。
答案 0 :(得分:1)
我已经通过升级到MySQL 5.1.66解决了这个问题。请注意,我不只是升级旧实例,而是完全从我的系统中取消它并从头开始安装新版本。因此,我仍然无法判断问题是由于我的旧安装配置错误还是仅仅是错误。
然而,现在一切正常。