SQLAlchemy:为同一张表创建两个类(模型)

时间:2019-11-28 16:13:22

标签: python python-3.x sqlalchemy

我正在使用星型模式与数据库进行交互。我有一个事实表,它以两种不同方式依赖于维度表。

当手动编写SQL时,我以不同的名称两次连接维度表。我想在SQLAlchemy中做同样的事情。

在阅读了文档和this线程之后,我所拥有的是:

from sqlalchemy import create_engine, Column, Integer, String, TIMESTAMP, Float, ForeignKey, Boolean
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation, sessionmaker, synonym, aliased

Base = declarative_base()

class RBase(Base):
    __tablename__ = "regions"
    # id
    id = Column("id", Integer, primary_key=True, nullable=True)
    # Dimensions
    region = Column("region", String, nullable=True)
    _all_dimensions = ()


class Regions(RBase):
    # Dimensions
    __mapper_args__ = {
        'polymorphic_identity': 'Regions'
    }


class OtherRegions(RBase):
    # Dimensions
    otherregion = synonym("region")
    __mapper_args__ = {
        'polymorphic_identity': 'OtherRegions'
    }


class FactTable(Base):
    __tablename__ = "somefact"
    # Dimension ids
    sourceregionid = Column(
        "sourceregionid", Integer, ForeignKey("regions.id"), primary_key=True, nullable=True
    )
    targetregionid = Column(
        "targetregionid", Integer, ForeignKey("regions.id"), primary_key=True, nullable=True
    )
    # Facts
    examplefact = Column("examplefact", Float, nullable=True)
    # Relations
    region = relation(Regions, innerjoin=True, foreign_keys=[sourceregionid])
    otherregion = relation(OtherRegions, innerjoin=True, foreign_keys=[targetregionid])

我从中得到的陈述是

SELECT regions.region, somefact.examplefact
FROM somefact 
JOIN regions ON regions.id = somefact.sourceregionid 
JOIN regions ON regions.id = somefact.targetregionid 
WHERE regions.region = %(region_1)s

原因和错误。我想要的是

SELECT regions.region, otherregions.region as otherregion, somefact.examplefact
FROM somefact 
JOIN regions ON regions.id = somefact.sourceregionid 
JOIN regions as otherregions ON otherregions.id = somefact.targetregionid 
WHERE regions.region = %(region_1)s

我已经花了一段时间讨论这个问题,所以我们将不胜感激。

0 个答案:

没有答案
相关问题