SQLite中的枚举

1 投票
1 回答
1002 浏览
提问于 2025-04-18 13:07

我的模型使用了几个枚举(Enum)来表示不同的列,使用SQLAlchemy的create_all()方法在PostgreSQL中创建表是没问题的,但在SQLite中就不行了,它会卡住。

问题似乎出在创建枚举上,按照我的理解,SQLite不支持这些枚举,但根据SQLAlchemy的文档,这不应该是个问题。当我在一个SQLite内存数据库上运行create_all()时,它就卡住了,即使设置了echo=True,也没有任何输出。

我尝试了以下代码来演示这个问题:

from sqlalchemy import create_engine, Enum
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
e = Enum('foo', 'bar', metadata=Base.metadata)

engine = create_engine('sqlite:///:memory:', echo=True)
Base.metadata.create_all(bind=engine)

当我运行这个脚本时,完全没有任何输出,它就卡在那儿。Python的CPU使用率达到100%,脚本一直没有结束,直到我按下ctrl-c。

当我在我的实际模式上运行create_all()时,它会输出一些PRAGMA命令,试图判断表是否存在,但在创建枚举时又卡住了。我尝试逐步删除模型定义中的代码,直到它正常工作,这时我才发现是枚举的问题。

我是在Python 3.4上,使用SQLAlchemy 0.9.6和SQLite 3.7.13进行的测试。

1 个回答

2

最近我一个朋友也遇到了同样的问题,看起来像是SQLA里的一个无限循环错误(我应该把这个问题报告上去,所以谢谢你提供的这个简单测试案例 :))。

只要把你真实代码中的 metadata= 这个参数去掉就行;只要这个枚举类型在一个声明类里面使用,它会自动继承正确的元数据。

撰写回答