如何使用sqlalchemy核心编写更新左连接多表查询(MySQL)?

如何使用sqlalchemy核心编写更新左连接多表查询(MySQL)?,sqlalchemy,Sqlalchemy,如何使用sqlalchemy核心编写以下sql update t1 left join t2 on t1.event_date=t2.event_date set t1.sales=coalesce(t2.sales,0); 将提供: t1.update().values( sales=select([t2.c.sales]).\ where(t2.c.event_date==t1.c.event_date).\ as sca

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

update t1 left join t2 on t1.event_date=t2.event_date set t1.sales=coalesce(t2.sales,0);
将提供:

t1.update().values(
        sales=select([t2.c.sales]).\
             where(t2.c.event_date==t1.c.event_date).\
             as scalar()
     )
Left join and coalesce missing将检查该语句是否指向正确的方向

将提供:

t1.update().values(
        sales=select([t2.c.sales]).\
             where(t2.c.event_date==t1.c.event_date).\
             as scalar()
     )

Left join and coalesce missing将检查此if语句是否指向正确的方向。

在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的一个缺陷或缺乏特性。因此,我提交了一个问题:

它可能在某些情况下起作用。但对于您的情况,它会引发错误:当SQL在实际的MySQL服务器上运行时,字段列表中的“sales”列是不明确的,因为两个表中都存在列名称,这就是不明确的含义

于2020年9月30日编辑:

zzzeek Mike Bayer提议:


此外,他还向master分支和rel_1_3分支提交了此问题的修复程序。希望在SQLAlchemy的下一个1.3.x小版本中将很快修复此问题。

在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的一个缺陷或缺乏特性。因此,我提交了一个问题:

它可能在某些情况下起作用。但对于您的情况,它会引发错误:当SQL在实际的MySQL服务器上运行时,字段列表中的“sales”列是不明确的,因为两个表中都存在列名称,这就是不明确的含义

于2020年9月30日编辑:

zzzeek Mike Bayer提议:


此外,他还向master分支和rel_1_3分支提交了此问题的修复程序。希望它能在SQLAlchemy的下一个1.3.x小版本中很快得到修复。

我测试了这条语句,它生成的sql如下:update t1 set t1.sales=select t2.sales from t2其中t1.event_date=t2.event_date我想知道这两个sql在性能上是否有任何差异。性能是rdms的问题。。。另一点是,它是否足够正确,因为不匹配时需要=0。我测试了这个语句,它生成的sql如下:update t1 set t1.sales=select t2.sales from t2其中t1.event_date=t2.event_date我想知道这两个sql在性能上是否有任何差异。性能是rdms的问题。。。另一点是它是否足够正确,因为不匹配时需要=0。