SQLachemy模型的NOT NULL约束失败

时间:2016-01-14 06:58:50

标签: python sqlite sqlalchemy

我最近开始使用数据库。我正在尝试使用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之间......我不太了解。请帮助这个可怜的noobie,谢谢!

2 个答案:

答案 0 :(得分:2)

我认为原因可能是BIGINT不允许在sqlite中使用自动增量的主键。看到这个:Does BIGINT auto increment work for SQLAlchemy with sqlite?

答案 1 :(得分:0)

我对sqlite3有很多经验,但在postgresql中你应该在你的pkey列中使用autoincrement=True

所以,尝试用id列实现这个:

id = sa.Column(sa.BigInteger, primary_key=True, autoincrement=True)