【问题标题】:autoincrement for primary key not working in sqlalchemy主键的自动增量在 sqlalchemy 中不起作用
【发布时间】:2022-01-25 22:37:45
【问题描述】:
Base = declarative_base()

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, autoincrement=True)
    user_id = Column(String, primary_key=True)
    first_name = Column(String(50))
    last_name = Column(String(50))

    children = relationship("UserAndGroup")

class Group(Base):
    __tablename__ = "groups"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50))

    children = relationship("UserAndGroup")

class UserAndGroup(Base):
    __tablename__ = "groups_users"
    user_id = Column(Integer, ForeignKey("users.id"), primary_key=True)
    group_id = Column(Integer, ForeignKey("groups.id"), primary_key=True)

我在上面附上了我的模型。

插入用户时:

session.add(User(user_id="johnny123", first_name="John", last_name="Don"))

我收到以下错误:

sqlalchemy.exc.IntegrityError: (psycopg2.errors.NotNullViolation) null value in column "id" violates not-null constraint
DETAIL:  Failing row contains (null, johnny123, John, Don).

我正在使用以下软件包:

SQLAlchemy   1.4.29
psycopg2     2.9.2

我浏览了文档,它说自动增量是主键的默认行为。

来源:https://docs.sqlalchemy.org/en/14/core/metadata.html?highlight=autoincrement#sqlalchemy.schema.Column.params.autoincrement

我可能做错了什么,感谢您的帮助。

【问题讨论】:

  • primary_key= True 用于 id 和 user_id?
  • 您最近更换了模型吗?您的表是否已经存在?
  • 是的,我改变了我的模型,但忘了放下它们。

标签: python postgresql sqlalchemy


【解决方案1】:

tl;dr 您的表已经存在。 SQLalchemy 不会重新创建它们。因此,您对模型架构的更改无效。在 Postgres 中检查您的实际模型。

如果您想更改现有表的架构,您将不得不删除并重新创建表,丢失数据,或者migrate 它们。


您的 UserAndGroup 模型无效。用户在 (id, user_id) 上有一个复合主键,但 UserAndGroup 试图引用 ForeignKey("users.id")。当您尝试创建此表时,它应该会导致错误。

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidForeignKey) there is no unique constraint matching given keys for referenced table "users"

但是如果表已经存在,SQLalchemy 不会尝试重新创建它们并且不会出错。

该复合主键似乎没有任何用途。 users.id 已经是独一无二的。如果你想确保user_id 是唯一的,不要让它成为主键的一部分,声明它是唯一的。

并且可能将其命名为 username 以避免将其与 users 表的外键混淆。

【讨论】:

  • 谢谢,我忘了放下它们,我修好了我的模型。
猜你喜欢
  • 2021-10-29
  • 2017-03-09
  • 2023-03-13
  • 2016-08-08
  • 2010-10-11
  • 1970-01-01
  • 2015-08-06
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多