是否有可能在分离到不同子模块的不同(Postgres)模式之间构建SQLAlchemy关系?

2024-09-30 16:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

设想一个名为mydbmod的简单python模块,它有两个子模块schema1schema2,以这种方式构造为由模式分隔的SQLAlchemy模型:

mydbmod/base.py
mydbmod/schema1.py
mydbmod/schema2.py

现在假设我们有一个场景,在这个场景中,我们希望跨这些模式构建relationships(),而不合并python文件。有办法吗

在文件mydbmod/schema1.py中,我们可能有:

from sqlalchemy.base import engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import MetaData
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship

metadata = MetaData(schema='schema1', bind=engine)

Base = declarative_base(metadata=metadata)

class People(Base):
    __tablename__ = 'people'
    id = Column(Integer, primary_key=True)
    name = Column(String(50), unique=True)

    car = relationship('Car', back_populate='owner')

metadata.create_all()

在文件mydbmod/schema1.py中,我们可能有:

from sqlalchemy.base import engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import MetaData
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship

metadata = MetaData(schema='schema2', bind=engine)

Base = declarative_base(metadata=metadata)

class Car(Base):
    __tablename__ = 'car'
    id = Column(Integer, primary_key=True)
    make = Column(String(50))
    model = Column(String(50))
    owner_id = Column(Integer, ForeignKey('schema1.people.id'))

    owner = relationship('People', back_populate='car')

metadata.create_all()

显然,我们不能创建循环导入引用。我现在看到的唯一解决方案是将两个文件合并为一个文件,并显式引用这些类,这是不需要的。还有什么我能做的吗


Tags: 文件frompyimportbasestringsqlalchemycolumn