Создайте запрос из списка имен таблиц с неизвестной длиной, используя SQLAlchemy и Postgresql

Я имею дело с данными временных рядов и пытаюсь избежать отношения «многие к одному» в каждой строке одной таблицы записей, где все записи смешиваются вместе (поскольку все серии имеют разное количество столбцов).

Вместо этого я хочу разделить записи между несколькими таблицами, чтобы разделить отдельные ряды данных.

У меня много таких таблиц:

# series 1 record tables:
CREATE TABLE records_1 (
    id BIGSERIAL PRIMARY KEY,
    level DOUBLE PRECISION
    #... more columns
);
CREATE TABLE records_2 (
    id BIGSERIAL PRIMARY KEY,
    level DOUBLE PRECISION
    #... more columns
);
CREATE TABLE records_34 (
    id BIGSERIAL PRIMARY KEY,
    level DOUBLE PRECISION
    #... more columns
);
# series 2 record tables
CREATE TABLE records_101 (
    id BIGSERIAL PRIMARY KEY,
    level DOUBLE PRECISION,
    height DOUBLE PRECISION
    #... more columns
);
CREATE TABLE records_102 (
    id BIGSERIAL PRIMARY KEY,
    level DOUBLE PRECISION,
    height DOUBLE PRECISION
    #... more columns
);

И затем у меня есть класс со строкой, представляющей имена таблиц, связанных с этим классом:

class Serie(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    record_tables = db.Column(db.String(255))

Пример:

s1 = Serie() 
s1.record_tables = 'records_1, records_2, records_34'
s2 = Serie()
s2.record_tables = 'records_101, records_102'

Я хотел бы иметь возможность выбирать все записи, связанные с данной серией, на основе строки record_tables. Разделить и удалить пробелы легко, но как мне динамически построить запрос?

Что-то вроде «для каждой таблицы в record_tables_list выбрать все записи из таблицы и вернуть все записи из всех таблиц в списке», но в одном SQL-запросе вместо добавления результатов в список в python (что, как мне кажется, медленнее).

Думаю, мне следует использовать UNION, так как я воссоздал такой запрос вручную в SQL. Но как это сделать с неизвестным количеством имен таблиц в Serie.record_tables?

Обновление:

Итак, кажется, что необработанный запрос работает при присоединении к списку очищенных записей record_tables (это зависит от пользовательского ввода (моего собственного), поэтому мне нужно очистить его, чтобы удалить опечатки и т. Д.):

tables = ', '.join([x.strip() for x in record_tables.split(',')])
raw_query = 'SELECT * FROM ' + tables
results = db.engine.execute(raw_query)
for row in raw_query:
    print row    # (1L, 123.0, 1L, 456.0)

Изменить: нет, это не работает. хм.


person pjgb    schedule 16.02.2015    source источник
comment
Почему бы вам не иметь все данные только в одной таблице, так предполагается использовать PostgreSQL. Закодируйте серию в столбце VARCHAR с помощью '1', '2', '2a' и т. д.   -  person Antti Haapala    schedule 16.02.2015
comment
Спасибо, Антти, я подумал об этом (но использовал связь с серией вместо строкового представления). Просто кажется таким ненужным иметь все эти дополнительные данные в столбце вместо отдельной таблицы...?   -  person pjgb    schedule 16.02.2015
comment
Кроме того, серии имеют разные столбцы. Не уверен, как я смогу сделать это в одной таблице, не имея большого количества общих имен столбцов (col1_name, col1_val, col2_name, col2_val и т. д.).   -  person pjgb    schedule 16.02.2015


Ответы (1)


class Serie(Base):
    __tablename__ = 'serie'
    id = Column(Integer, primary_key=True)
    record_tables = Column(String(255))

    @property
    def get_records(self):
        sess = object_session(self)
        tables = [x.strip() for x in self.record_tables.split(',')]
        raw_query = '\nUNION ALL\n'.join(
            'SELECT * FROM ' + table for table in tables)
        results = sess.execute(raw_query).fetchall()
        return results

Это предполагает, что все таблицы record, настроенные в Serie, имеют одинаковые столбцы и порядок столбцов одинаковый.

person van    schedule 17.02.2015
comment
ОП заявил, что у них не было одинаковых столбцов и, следовательно, не обязательно в том же порядке. - person Antti Haapala; 17.02.2015
comment
Я не так это понимаю: разные серии имеют разные столбцы, но одна серия имеет данные, хранящиеся в нескольких records_xx таблицах с одной и той же структурой. - person van; 17.02.2015
comment
@van, вы правы как в форматах таблиц, так и в решении. Большое спасибо, я понятия не имел, что так легко объединить несколько запросов. - person pjgb; 17.02.2015