【发布时间】:2021-03-29 12:28:21
【问题描述】:
我尝试将现有数据库自动映射到类。在两个表之间,我有多个连接路径,我无法使用 SQLAlchemy 正确管理这些路径。
这是我数据库中的示例架构:
CREATE SCHEMA shop;
CREATE TABLE shop.address (
id SERIAL PRIMARY KEY,
name text,
address text
)
CREATE TABLE shop.orders (
id SERIAL PRIMARY KEY,
items text,
billingaddr_id integer REFERENCES address,
shippingaddr_id integer REFERENCES address
);
我已经声明了这些外键的关系如下:
from sqlalchemy import create_engine
from sqlalchemy.orm import relationship, Session
from sqlalchemy.ext.automap import automap_base
engine = create_engine(
"postgresql://postgres:postgres@localhost:5432/postgres",
future=True
)
Base = automap_base()
class Order(Base):
__tablename__ = 'orders'
__table_args__ = {"schema": "shop"}
billingaddr = relationship('address', foreign_keys="Order.billingaddr_id", backref="orders_billed")
shippingaddr = relationship('address', foreign_keys="Order.shippingaddr_id", backref="orders_shipped")
Base.prepare(engine, schema='shop', reflect=True)
Address = Base.classes.address
现在当创建一个新的地址对象(jack)时:
jack = Address(name='Jack', address='57815 Cheryl Unions')
我收到警告:
"SAWarning: 关系 'Order.address' 会将列 address.id 复制到列 orders.shippingaddr_id,这与关系冲突:'address.orders_shipped' (将 address.id 复制到 orders.shippingaddr_id), 'Order .shippingaddr'(将 address.id 复制到 orders.shippingaddr_id)。如果这不是本意,请考虑这些关系是否应该与 back_populates 链接,或者如果 viewonly=True 应该应用于一个或多个,如果它们是只读的。对于外键约束部分重叠的不太常见的情况,orm.foreign() 注释可用于隔离应写入的列。'overlaps' 参数可用于删除此警告。"
应该如何解决?
address 关系是自动创建的一个自动映射,现在让我很困惑。我实际上不再需要那个,因为我自己建立了关系。我可以以某种方式阻止自动映射默认创建它,还是可以删除创建的不必要的关系?我试图在类声明中设置address = None,但它没有用。 address 关系仍在创建中。
【问题讨论】:
标签: python postgresql sqlalchemy