我最近开始使用数据库。我正在尝试使用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,谢谢!
答案 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)