在sqlalchemy / postgres中使用外键有效地批量插入行

时间:2019-04-25 22:49:50

标签: python postgresql sqlalchemy

我有一个存储时间序列数据的表;每行都标记有数据源和数据类型。有一个数据源表,其中包含人类可读的标签和一些元数据,还有一个类似的数据类型表:

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对象?

0 个答案:

没有答案