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()函数的正确定义成为迄今为止最简单/最干净的解决方案。
答案 0 :(得分:1)
这个答案可以在SQLAlchemy的未来发展中被淘汰,但我发现使用SQLAlchemy方法构建我自己的子句元素很有用。也许,最好的例子可以从sqlalchemy-fulltext-search项目中找到。
通过继承ClauseElement
并对其进行编译,几乎可以对SQLAlchemy工具库进行任何添加,而不仅仅是函数。该示例还显示了如何在需要时对类进行检测(在链接示例中,用于定义特殊索引)。
此外,这样可以添加特定于方言的语法。
我想,你会找到适合你的所有需要的成分。
当然,SQLAlchemy允许传递任何SQL文本,但我想Pythonic语法在这里很有趣。