我有一个存储时间序列数据的表;每行都标记有数据源和数据类型。有一个数据源表,其中包含人类可读的标签和一些元数据,还有一个类似的数据类型表:
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Source(Base):
__tablename__ = "sources"
source_id = sa.Column(sa.Integer, primary_key=True)
created_at = sa.Column(sa.DateTime(timezone=True), server_default=sa.func.now())
label = sa.Column(sa.String, nullable=False, index=True, unique=True)
class DataCategory(Base):
__tablename__ = "data_categories"
data_category_id = sa.Column(sa.Integer, primary_key=True)
created_at = sa.Column(sa.DateTime(timezone=True), server_default=sa.func.now())
label = sa.Column(sa.String, nullable=False, index=True, unique=True)
unit = sa.Column(sa.String, nullable=True)
class TimeInterval(Base):
__tablename__ = "time_intervals"
interval_end = sa.Column(sa.DateTime(timezone=True), primary_key=True, index=True)
source_id = sa.Column(sa.Integer, sa.ForeignKey("sources.source_id"), primary_key=True, index=True)
data_category_id = sa.Column(
sa.Integer, sa.ForeignKey("data_categories.data_category_id"), index=True
)
value = sa.Column(sa.Float, nullable=False)
一个来源可能带有类似weather.station.2
的标签;数据类别可能具有temperature
之类的标签。我想编写一个函数来有效地以
points = [{'interval_end': '2019-01-01 14:00-00:00', 'source': 'weather.station.2', 'data_category': 'temperature', 'value': 31.1}, ...]
在原始的postgres中,我使用从文字中构建的CTE,如下所示(尽管我不需要添加新的类别/来源):https://dba.stackexchange.com/questions/46410/how-do-i-insert-a-row-which-contains-a-foreign-key
是否有一种有效的方法可以在sqlalchemy中实现这一目标,而又不从数据库中提取所有DataCategory
/ Source
对象?