Эффективная массовая вставка строк с внешними ключами в sqlalchemy / postgres - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть таблица, в которой хранятся данные временных рядов; каждая строка помечена источником данных и типом данных. Существует таблица источников данных с удобочитаемыми метками и некоторыми метаданными, а также аналогичная таблица типов данных:

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 из базы данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...