【发布时间】:2016-01-14 06:58:49
【问题描述】:
我最近开始使用数据库。我正在尝试使用 SQLalchemy 建立模型。 models.py 和 database.py 如下所示:
#models.py
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Expense(Base):
__tablename__ = 'expense'
id = sa.Column(sa.BigInteger, primary_key=True)
username = sa.Column(
sa.String,
info={'label': 'Name'},
nullable=False
)
def __init__(self, username):
self.username = username
def __repr__(self):
return '<User %r>' % (self.username)
和
#database.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from models import Base, Expense
def init_db():
engine = create_engine('sqlite:///test.db')
Base.metadata.create_all(engine)
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
new_entry = Expense(username="noobie")
session.add(new_entry)
session.commit()
init_db()
我在 python3 上运行这些,当我运行 database.py 时,我得到了
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: expense.id [SQL: 'INSERT INTO expense (username) VALUES (?)'] [parameters: ('noobie',)]
一个回复here 建议使用sqlite_autoincrement=True 将解决问题,但它对我的不起作用。我认为在分配主键时问题发生在 SQLite3 和 sqlalchemy 之间的某个地方......我也不知道。请帮助这个可怜的菜鸟,谢谢!
【问题讨论】:
-
嗨@return-0,您在导入开始时忘记了 i ;)
-
@AndyK 感谢您指出这一点。不幸的是,这是由于我的复制粘贴技术不佳。问题不在我的真实代码中。
-
我有一段时间没有使用 SQLAlchemy,但我相当肯定这不是您为 Flask 应用程序设置它的方式。您实际上应该在标准 SQLAlcehmy 上使用
flask-sqlalchemy:flask-sqlalchemy.pocoo.org/2.1/quickstart -
@IanAuld 我用什么web框架没关系,上面的代码和flask完全没有关系。
-
添加
autoincrement之后,是不是把数据库文件删了再新建?create_all不执行迁移。
标签: python sqlite sqlalchemy