主键的自动增量在 sqlalchemy 中不起作用

autoincrement for primary key not working in sqlalchemy

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

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

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

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


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

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

但是如果 tables 已经存在,SQLalchemy 将不会尝试重新创建它们并且没有错误。

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

并可能将其命名为 username 以避免将其与 users table.

的外键混淆