我正在处理时间序列数据,并且我试图避免在所有记录混合在一起的单个记录表的每一行上都存在多对一的关系(因为该系列都有不同的列数)。
相反,我想在多个表之间拆分记录以将各个数据系列分开。
我有很多这样的表:
# 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)
编辑:不,这不起作用。嗯。