在SQLAlchemy中使用MariaDB的COLUMN_GET()

时间:2017-10-03 13:50:18

标签: python sqlalchemy mariadb

MariaDB允许dynamic columns,这是由COLUMN_ADD()COLUMN_GET()函数访问的稀疏填充数据集。

但是,我们找不到使用SQLAlchemy动态列的方法。我们尝试过:

from sqlalchemy.sql import func

...

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

生成以下SQL:

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(这将首先否定使用SQL炼金术的大部分好处)。

我们还查看了很多关于如何处理列的SQLAlchemy源代码,希望我们可以复制该格式并定义自定义比较器。问题在于动态列在调用时需要index参数,这将使COLUMN_GET()函数的正确定义成为迄今为止最简单/最干净的解决方案。

1 个答案:

答案 0 :(得分:1)

这个答案可以在SQLAlchemy的未来发展中被淘汰,但我发现使用SQLAlchemy方法构建我自己的子句元素很有用。也许,最好的例子可以从sqlalchemy-fulltext-search项目中找到。

通过继承ClauseElement并对其进行编译,几乎可以对SQLAlchemy工具库进行任何添加,而不仅仅是函数。该示例还显示了如何在需要时对类进行检测(在链接示例中,用于定义特殊索引)。

此外,这样可以添加特定于方言的语法。

我想,你会找到适合你的所有需要​​的成分。

当然,SQLAlchemy允许传递任何SQL文本,但我想Pythonic语法在这里很有趣。