【问题标题】:NOT NULL constraint failed for SQLachemy modelSQLachemy 模型的 NOT NULL 约束失败
【发布时间】: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-sqlalchemyflask-sqlalchemy.pocoo.org/2.1/quickstart
  • @IanAuld 我用什么web框架没关系,上面的代码和flask完全没有关系。
  • 添加autoincrement之后,是不是把数据库文件删了再新建? create_all 不执行迁移。

标签: python sqlite sqlalchemy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我在 sqlite3 方面没有太多经验,但在 postgresql 中,您应该在 pkey 列中使用autoincrement=True

    所以,试着用这样的 id 列来实现这个:

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

    【讨论】:

      猜你喜欢
      • 2015-04-22
      • 2018-08-24
      • 2022-01-19
      • 2021-11-16
      • 2020-12-18
      • 2021-03-20
      • 2020-02-11
      • 2019-02-13
      • 2017-12-31
      相关资源
      最近更新 更多