2

我有多个星型模式格式的相关表,如下所示:

FACT TABLE
==========
id (primary key)
globalattribute1
globalattribute2

DIMENSION TABLE 1
==========
id (foreign key to fact_table.id)
specificattribute1
specificatrribute2

DIMENSION TABLE 2
==========
id (foreign key to fact_table.id)
specificattribute1
specificatrribute2

这是我迄今为止在我的 Python 代码中的内容(除了 Base, session 。你能提供任何建议吗?

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import *
engine = create_engine('mysql://...')
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()

class Fact(Base):
    __tablename__ = 'fact_table'
    id = Column(Integer, primary_key=True)
    global1 = Column(String(255))
    global2 = Column(String(255))


    #Constructor

class Dimension1(Base):
    __tablename__ = 'dimension1'
    id = Column(Integer, ForeignKey('fact_table.id'))
    specific1 = Column(String(255))
    specific2 = Column(String(255))

    #Constructor

class Dimension2(Base):
    __tablename__ = 'dimension2'
    id = Column(Integer, ForeignKey('fact_table.id'))
    specific1 = Column(String(255))
    specific2 = Column(String(255))

    #Constructor

Base.metadata.create_all(engine) 

我如何使用它来插入一条记录,该记录将包含一个维度表的全局属性和特定属性?

4

1 回答 1

2

如果我对您的理解正确,您想同时拥有两者Dimension1Dimension2与之建立一对一的关系Fact?在这种情况下,您可能需要查看一对一关系配置。

class Fact(Base):
    ...
    dim1 = relationship('Dimension1', uselist=False)
    dim2 = relationship('Dimension2', uselist=False)


    #Constructor

此外,您可能想查看关联代理。我没有使用它们,但据我了解,它们可用于直接指定外部属性,而不是必须做例如fact.dim1.specific1

我希望这能回答你的问题。如果您不想要一对一,请查看其他可用的关系并查看适合的关系。

要添加新事实,请执行以下操作:

fact = Fact(...)
fact.dim1 = Dimension1(...)
fact.dim2 = Dimension2(...)
session.add(fact)

这将自动发出所有必要的查询session.commit(或者您进行交易)。有关更多详细信息,您可能还应该阅读Using The Session

于 2013-03-13T22:36:09.250 回答