我有一个星型模式格式的多个相关表,如下所示:
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)
如何使用它来插入一条包含全局attirbutes和其中一个维度表的特定属性的记录?
答案 0 :(得分:1)
如果我理解正确,您希望Dimension1
和Dimension2
与Fact
建立一对一的关系?在这种情况下,您可能希望查看One-To-One关系配置。
class Fact(Base):
...
dim1 = relationship('Dimension1', uselist=False)
dim2 = relationship('Dimension2', uselist=False)
#Constructor
此外,您可能需要查看association proxies。我没有使用它们,但据我所知,它们可以直接用于指定外来属性,而不是像以前那样做。 fact.dim1.specific1
我希望这能回答你的问题。如果您不想要一对一,请查看其他可用的关系,看看有什么适合。
要添加新事实,请执行以下操作:
fact = Fact(...)
fact.dim1 = Dimension1(...)
fact.dim2 = Dimension2(...)
session.add(fact)
这将自动在session.commit
上发出所有必要的查询(或者您进行交易)。有关更多详细信息,您可以另外阅读Using The Session。