2014-07-13 51 views
0

我的模型为各种列使用了几枚枚举,使用SQLAlchemy的create_all()方法在PostgreSQL中正常工作,但它不适用于SQLite,它只是停滞不前。在SQLite中枚举

这个问题似乎与创建Enum的,据我可以告诉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使用100%的CPU,脚本永远不会结束,直到我按Ctrl-C它。

当我在我的实际模式上尝试create_all()时,它确实会回显一些PRAGMA命令,试图确定表是否存在,但是它会停止创建枚举。我试图从模型定义中删除代码,直到它工作得很好,这是我发现它是Enums的时候。

我试着在SQL 3.4上用SQLAlchemy 0.9.6使用SQLite 3.7.13运行它。

+1

我相信这是一个将元数据传递给'Enum'的错误。从你的真实代码中删除kwarg。 – Eevee

+0

你似乎是对的,我删除了元数据kwargs,它的工作原理。如果你把它写成答案,我可以投票赞成。 – Blubber

+0

当一个图书馆锁定紧张,这是一个错误。直接进入[bug跟踪器](https://bitbucket.org/zzzeek/sqlalchemy)。 – zzzeek

回答

1

最近有一位朋友遇到了同样的问题,它在SQLA中看起来像一个无限循环的错误(我真的应该报告,所以感谢这个最小的测试用例:))。

只需从您的真实代码中删除metadata= kwarg;只要枚举被用作声明类中的类型,它就会继承正确的元数据。