2017-10-03 10 views
1

MariaDBは、を使用できます。これは、データがまばらに埋め込まれたデータセットで、COLUMN_ADD()およびCOLUMN_GET()の関数でアクセスされます。SQLAlchemyでMariaDBのCOLUMN_GET()を使用する

しかし、SQLAlchemyで動的列を使用する方法はありません。我々は試してみました:

次のSQLを生成
from sqlalchemy.sql import func 

... 

query = session.query(
    func.COLUMN_GET(DynamicInfo.dyn_col, 256) 
).filter(
    DynamicInfo.index_id == index 
) 

SELECT COLUMN_GET(dyn_info.dyn_col, %(COLUMN_GET_2)s) AS `COLUMN_GET_1` 
FROM dyn_info 
WHERE dyn_info.index_id = %(index_1)s 

問題は、これは無効な構文がCOLUMN_GET()のためであるということです。タイプと値を含める必要があります。 COLUMN_GET(dyn_info.dyn_col, 256 AS INT)を取得する方法を理解することはできません(SQL錬金術を最初に使用する利点のほとんどを無効にします)。


我々はまた、我々はその形式をコピーして、カスタムコンパレータが定義されている可能性があることを期待して、列の処理方法でSQLAlchemyのソースコードの多くを見てきました。この問題は、呼び出されるときに動的な列にindexパラメータが必要であることにあります。これは、COLUMN_GET()関数をはるかに簡単できれいな方法で定義することになります。

答えて

1

この回答は、今後のSQLAlchemyの開発で廃止される可能性がありますが、SQLAlchemyを使用して独自の節要素を作成すると便利です。おそらく、最も良い例はsqlalchemy-fulltext-searchプロジェクトから見つけることができます。

ClauseElementをサブクラス化してコンパイルすることで、関数だけでなく、SQLAlchemyアーゼルをほとんどすべて追加することができます。この例では、クラスが必要な場合(リンクされた例では、特別なインデックスを定義するために)、クラスを計測する方法も示しています。

また、このようにして、方言固有の構文を追加できます。

私はあなたのケースに必要なすべての成分を見つけると思います。

もちろん、SQLAlchemyは任意のSQLテキストを渡すことができますが、Pythonic構文はここで興味深いと思います。

+1

私は実際にこれをやってしまった!私たちの目的のために、独自の 'Function'を作成するのが最もきれいでしたが、唯一の違いは' ClauseElement'の特別な処理があることです。しかし、答えをありがとう。 – Kittsil

関連する問題