提问人:hreimer 提问时间:11/15/2023 更新时间:11/15/2023 访问量:48
SqlAlchemy 使用原始 sql 中的其他选择列扩展现有查询
SqlAlchemy extending an existing query with additional select columns from raw sql
问:
我对 SQLAlchemy 和 Python 很陌生,必须修复遗留环境中的一些错误,所以请耐心等待。
环境:
Python 2.7.18
瓶子:0.12.7
SQLAlchemy:老实说不知道,但 2014 年的东西(可能是 0.9.8?
MySQL版本:5.7
场景:我下面有这个 SQL 语句,它透视链接表并将行动态添加为原始表中的附加列 - 我在 SQL Workbench 中构造了它,它返回了我想要的结果: 表 t1 中的所有指定列以及表 t2 中值的其他列都显示在结果中
SET SESSION group_concat_max_len = 1000000; --this is needed to prevent the group_concat function to cut off after 1024 characters, there are quite a few columns involved that easily exceed the original limit
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT(
'SUM(
CASE WHEN custom_fields.FIELD_NAME = "', custom_fields.FIELD_NAME, '" THEN
custom_fields_tags_link.field_value END)
AS "', custom_fields.FIELD_NAME, '"')
) AS t0
INTO @sql
FROM tags t1 LEFT OUTER JOIN custom_fields_tags_link t2 ON t1.id = t2.tag_id JOIN
custom_fields ON custom_fields.id = t2.custom_field_id;
SET @sql = CONCAT('SELECT tags.id AS tags_id,
tags.tag_type AS tags_tag_type, tags.name AS
tags_name, tags.version AS tags_version, ', @sql,
' FROM tags LEFT OUTER JOIN custom_fields_tags_link ON tags.id =
custom_fields_tags_link.tag_id JOIN custom_fields ON custom_fields.id =
custom_fields_tags_link.custom_field_id GROUP BY tags.id');
SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
问题:我有一个已经存在的 SQLAlchemy 会话,它扩展了用于分页的查询。目前,此查询返回表 t1 中我指定的所有列,这些列与表 t2 联接,custom_fields以获取所有必需的列。缺少的部分是上述语句的 SELECT GROUP_CONCAT部分的 SQLAlchemy 表示,其余部分都已处理完毕 - 因为我可以控制并知道此表的前端预制的外观,现在还有 SQL Workbench 中的原始 SQL 版本,我试图通过咨询 https://docs.sqlalchemy.org/en/14/orm/queryguide.html#orm-queryguide-selecting-text 和https://docs.sqlalchemy.org/en/14/core/sqlelement.html#sqlalchemy.sql.expression.TextClause.columns,但是现在我被困在如何在不在函数中静态键入列的情况下将此对象转换为 因为我不知道用户为这些custom_fields提供的列名是什么。TextClause
TextualSelect
.column()
目标:将动态创建的原始 SQL 语句连接到我现有的 SQLAlchemy 查询,以从链接表中选择这些动态创建的字段,以便获得与在 SQL 编辑器中执行此原始 SQL 语句时相同的结果
尝试:
#session is a app-wide shared MySQL session object that is created via sqlalchemy.orm's sessionmaker, scoped_session function
alchemy = session.query(Tag)
try:
#mainly the next line will be changed (x)
select_custom_fields_columns_stmt = select().from_statement(text(
'''SET SESSION group_concat_max_len = 1000000;
SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT(
'SUM(
CASE WHEN custom_fields.FIELD_NAME = "', custom_fields.FIELD_NAME, '" THEN
custom_fields_tags_link.field_value END) AS "', custom_fields.FIELD_NAME, '"'))
AS t0
INTO @sql
FROM tags t1 LEFT OUTER JOIN custom_fields_tags_link t2 ON t1.id = t2.tag_id JOIN custom_fields ON custom_fields.id = t2.custom_field_id;''')) #or here after the statement (y)
# next line is my attempt to add the columns that have been generated by the previous function but of course unsuccessful
alchemy = alchemy.add_columns(select_custom_fields_columns_stmt)
except:
logException()
joined_query = alchemy.outerjoin(model.tag.CustomFieldTagLink)
.join(model.tag.CustomField)
答:这会导致以下错误:AttributeError: 'Select' object has no attribute 'from_statement'
B:将上面构造其他行查询的行 (x) 更改为 --> 结果如下:select_custom_fields_columns_stmt = session.select().from_statement(text(...
AttributeError: 'Session' object has no attribute 'select'
C:在 (y) --> 处添加语句会导致:.subquery("from_custom_fields")
AttributeError: 'AnnotatedTextClause' object has no attribute 'alias'
D:(x)替换的其他尝试,或者也没有导致额外的列select()
session.query()
session.query(Tags)
我还能尝试什么?在SQLAlchemy中编写整个原始SQL部分是否更可取/更容易,如果是这样,我该怎么做?
答: 暂无答案
评论