如何使用sqlalchemy核心编写UPDATE左联接多表查询(MySQL)?

比尔·格林斯

如何用sqlalchemy核心编写以下sql?

update t1 left join t2 on t1.event_date=t2.event_date set t1.sales=coalesce(t2.sales,0);
岩质岩

在Python控制台中运行以下代码:

Python 3.8.2 (default, May  6 2020, 10:53:18) 
[Clang 11.0.3 (clang-1103.0.32.59)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlalchemy
>>> print(sqlalchemy.__version__)
1.3.19
>>> from sqlalchemy import update, func, table, column, types
>>> from sqlalchemy.dialects import mysql
>>> mysql_dialect = mysql.dialect()
>>> c1 = column("id", types.Integer)
>>> c2 = column("event_date", types.Date)
>>> c3 = column("sales", types.Integer)
>>> t1 = table("t1", c1, c2, c3)
>>> c1b = column("id", types.Integer)
>>> c2b = column("event_date", types.Date)
>>> c3b = column("sales", types.Integer)
>>> t2 = table("t2", c1b, c2b, c3b)
>>> j = t1.outerjoin(t2, t1.c.event_date == t2.c.event_date)
>>> v = {t1.c.sales: func.coalesce(t2.c.sales, 0)}
>>> s = update(j).values(v)
>>> print(s.compile(dialect=mysql_dialect))
UPDATE t1 LEFT OUTER JOIN t2 ON t1.event_date = t2.event_date SET sales=coalesce(t2.sales, 0)

您会看到,最终结果非常接近完美的SQL:语句中t1.缺少前缀SET sales=...我认为这是SQLAlchemy 1.3.19的错误(或缺乏功能)。所以我为此提交了一个问题:https : //github.com/sqlalchemy/sqlalchemy/issues/5617

在某些情况下可能会起作用。但是对于您来说,ERROR: Column 'sales' in field list is ambiguous当在实际的MySQL服务器上运行SQL时,它将增加,因为列名存在于两个表中(这是含糊的意思)。

于2020-09-30编辑:

zzzeek(Mike Bayer)提出了一种解决方法

>>> s = update(j).values(v).where(t1.c.id > 0)
>>> print(s.compile(dialect=mysql_dialect))
UPDATE t1 LEFT OUTER JOIN t2 ON t1.event_date = t2.event_date SET t1.sales=coalesce(t2.sales, 0) WHERE t1.id > 0

他还在master分支机构和rel_1_3分支机构中为此问题提交了修复程序希望它将在下一个SQLAlchemy的1.3.x次要版本中修复。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有左联接的MySQL多表查询

来自分类Dev

使用mysql查询的左联接中的问题

来自分类Dev

使用左联接优化MySql查询

来自分类Dev

MySQL查询左联接问题

来自分类Dev

MySQL选择与左联接查询

来自分类Dev

MySQL选择与左联接查询

来自分类Dev

MYSQL限制左联接查询

来自分类Dev

编写左联接作为子查询

来自分类Dev

在左联接中使用子查询时如何优化查询

来自分类Dev

使用左联接优化Mysql查询组Concat

来自分类Dev

mysql-使用左联接查询确定记录是否存在

来自分类Dev

如何在MYSQL中为多表级搜索编写查询

来自分类Dev

如何使用多个左联接优化SQL查询

来自分类Dev

如何在实体框架查询中使用左联接?

来自分类Dev

如何使用MySQL左联接两个表并从子查询的主查询中排除多行?

来自分类Dev

正确联接多个多对多表-MySQL查询

来自分类Dev

如何在MySQL中执行此查询,我应该使用左联接还是右联接或内部联接使用哪一个?

来自分类Dev

MySQL左联接自定义查询

来自分类Dev

MySQL左联接子查询分组

来自分类Dev

MySQL左联接子查询,带*

来自分类Dev

MySQL查询左联接访问变量

来自分类Dev

左联接上的MySQL查询问题

来自分类Dev

mysql查询问题与左联接

来自分类Dev

MySQL左联接查询不起作用

来自分类Dev

SQLAlchemy强制左联接

来自分类Dev

SQLAlchemy强制左联接

来自分类Dev

使用左联接表编辑查询

来自分类Dev

SQL在左联接中使用内部查询

来自分类Dev

带有左联接和内部联接的MySQL查询