如何用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] 删除。
我来说两句