私は時系列データを扱っており、すべてのレコードが混在している単一のレコードテーブルのすべての行で多対1の関係を回避しようとしています(シリーズはすべて異なる数の列を持っているため)。
代わりに、レコードを複数のテーブルに分割して、個々のデータ系列を分離したいと考えています。
これらのテーブルがたくさんあります:
# 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の各テーブルについて、テーブルからすべてのレコードを選択し、リスト内のすべてのテーブルからすべてのレコードを返す」のようなものですが、Pythonのリストに結果を追加するのではなく、1つのSQLクエリで行います(遅いと思います)。
このようなクエリを SQL で手動で再作成したため、UNION を使用する必要があると思います。しかし、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)
編集:いいえ、これは機能しません。うーん。