0

私は時系列データを扱っており、すべてのレコードが混在している単一のレコードテーブルのすべての行で多対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)

編集:いいえ、これは機能しません。うーん。

4

1 に答える 1

0
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

これは、 で構成されたすべてのレコードテーブルSerieが同じ列を持ち、列の順序が同じであることを前提としています。

于 2015-02-17T06:17:03.430 に答える