簡體   English   中英

SQLAlchemy ORM 命令式映射:使用外鍵插入將無法在不加載相關的情況下工作 object

[英]SQLAlchemy ORM imperative mapping: INSERT with foreign key won't work without loading related object

我正在使用命令式映射,我有一個多對一的關系,我想插入一個新的 Parent object 與知道其 id 的現有 Child 相關,而不提前加載 Child 數據。


    from typing import Optional
    
    from sqlalchemy import Column, Integer, ForeignKey, Table, create_engine
    from sqlalchemy.orm import relationship, sessionmaker
    
    from dataclasses import dataclass
    from sqlalchemy.orm import registry
    
    mapper_registry = registry()
    
    
    @mapper_registry.mapped
    @dataclass
    class Child:
        __table__ = Table(
            "child",
            mapper_registry.metadata,
            Column(
                "id",
                Integer,
                primary_key=True,
            ),
        )
        id: int
    
    
    @mapper_registry.mapped
    @dataclass
    class Parent:
        __table__ = Table(
            "parent",
            mapper_registry.metadata,
            Column(
                "id",
                Integer,
                primary_key=True,
            ),
            Column("child_id", Integer, ForeignKey("child.id"), nullable=False),
        )
        __mapper_args__ = {
            "properties": {"child": relationship("Child", lazy="joined", innerjoin=True)}
        }
        id: int
        child_id: int
    
        child: Optional[Child] = None

前任。 我想用一個 INSERT 添加 child.id = 7 的新 Parent:


    INSERT INTO parent (id, child_id) VALUES (1, 7);

但是這段代碼


    url = "postgresql://postgres:example@localhost/test"
    engine = create_engine(url)
    Session = sessionmaker(engine)
    parent = Parent(id=3, child_id=7)
    with Session() as session:
        with session.begin():
            session.add(parent)

拋出錯誤 psycopg2.errors.NotNullViolation:“child_id”列中的 null 值違反了非空約束

使用聲明性方法代替語句session.add(parent)可以正確執行 INSERT。

這次討論中解決了,

Parent.child取代child_id設置並解析為 child_id 的 NULL

解決方案:

class Parent:
    ...
    child: Optional[Child] = field(init=False)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM