Я имею дело с данными временных рядов и пытаюсь избежать отношения «многие к одному» в каждой строке одной таблицы записей, где все записи смешиваются вместе (поскольку все серии имеют разное количество столбцов).
Вместо этого я хочу разделить записи между несколькими таблицами, чтобы разделить отдельные ряды данных.
У меня много таких таблиц:
# 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)
Изменить: нет, это не работает. хм.
'1'
,'2'
,'2a'
и т. д. - person Antti Haapala   schedule 16.02.2015