У меня есть таблица, в которой хранятся данные временных рядов; каждая строка помечена источником данных и типом данных. Существует таблица источников данных с удобочитаемыми метками и некоторыми метаданными, а также аналогичная таблица типов данных:
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}, ...]
В raw postgres я использую CTE, построенный из литералов, как показано здесь (хотя мне не нужно добавлять новые категории / источники): https://dba.stackexchange.com/questions/46410/how-do-i-insert-a-row-which-contains-a-foreign-key
Есть ли эффективный способ достичь этого в sqlalchemy, не вытаскивая все объекты DataCategory
/ Source
из базы данных?