首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >psycopg2返回缺少的"id“主键列,而不是生成自身。

问psycopg2返回缺少的"id“主键列,而不是生成自身。
EN

Stack Overflow用户
提问于 2022-08-29 17:47:32
回答 1查看 109关注 0票数 1

你好,我有以下模型:

代码语言:javascript
复制
@dataclass
class User(Base, TimestampMixin):
    __tablename__ = "users"
    email: str
    password: int
    name: str
    id: Optional[int] = None

    id = Column(UUID(as_uuid=True), primary_key=True)
    email = Column(String(50), unique=True, nullable=False)
    password = Column(String(20), nullable=False)
    name = Column(String(15), unique=True, nullable=False)

当我尝试用以下代码生成一个新用户时:

代码语言:javascript
复制
def insert_user(session: Session, name: str, email: str, password: str) -> None:
    try:
        user = User(name=name, email=email, password=password)
        session.add(user)
    except:
        session.rollback()
        raise InsertUserError
    else:
        session.commit()

我得到以下错误:

代码语言:javascript
复制
ERROR in handlers: (psycopg2.errors.InvalidForeignKey) missing "id" primary key column

我没有输入id,因为我猜到psycopg2会自己生成它,但它没有。

如何自动创建该字段?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-29 17:54:21

仅仅因为列被标记为主键,并不意味着它具有默认值。SQLAlchemy将自动生成正确的SQL以自动生成主键仅当使用基于整数的主键列时。.对于UUID主键,您负责定义默认值。

您可以使用Python默认值:

代码语言:javascript
复制
id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)

(导入uuid模块)。此默认值仅在创建SQLAlchemy模型实例时使用,而不是在使用其他地方生成的SQL插入表时使用。

如果您已经安装了模块 (例如create extension uuid-ossp),并且希望使用函数在服务器上生成缺省值,则可以使用参数

代码语言:javascript
复制
id = Column(
    UUID(as_uuid=True),
    primary_key=True,
    server_default=func.uuid_generate_v4(),
)

其中func是sqlalchemy.sql.expression.func (from sqlalchemy.sql import func就足够了)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73532745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档