![](/img/trans.png)
[英]SQLAlchemy imperative mapping can't add entity using foreign key for another entity
[英]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.