主键的自动增量在 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
我查看了文档,它说自动增量是主键的默认行为。
我可能做错了什么,感谢您的帮助。
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.
的外键混淆
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
我查看了文档,它说自动增量是主键的默认行为。
我可能做错了什么,感谢您的帮助。
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.