繁体   English   中英

使用单个 SQLAlchemy .execute() 运行多个 MySQL 语句?

[英]Run multiple MySQL statements with a single SQLAlchemy .execute()?

我的mysql语句中定义了一个变量,在sql语句中对变量进行了操作,但是当我使用sqlalchemy执行sql语句时,在定义变量的位置显示错误。 语法错误(set @num=1;),好像 sqlalchemy 不能用定义的变量执行 sql

mysql代码:

set @a=0;set @b=null;select @a:=if(@b=num,@a+1,1) as rk,@b:=num from logs;

蟒蛇代码:

engine=create_engine("mysql+pymysql://root:root@localhost:3306/test",echo=True)
c = engine.raw_connection()
cursor = c.cursor()
result=cursor.execute("set @a=0;set @b=null;select @a:=if(@b=num,@a+1,1) as rk,@b:=num from logs;")

我只使用sqlalchemy执行上面的sql语句,报错:

C:\Program Files\Python36\lib\site-packages\pymysql\cursors.py:170: Warning: (1366, "Incorrect string value: '\xD6\xD0\xB9\xFA\xB1\xEA...' for column 'VARIABLE_VALUE' at row 485") result = self._query(query)
Traceback (most recent call last):
  File "C:/Users/DHL/PycharmProjects/fortify/sqladd.py", line 11, in 
    result=cursor.execute("set @a=0;set @b=null;select @a:=if(@b=num,@a+1,1) as rk,@b:=num from logs;")
  File "C:\Program Files\Python36\lib\site-packages\pymysql\cursors.py", line 170, in execute 
    result = self._query(query)
  File "C:\Program Files\Python36\lib\site-packages\pymysql\cursors.py", line 328, in _query 
    conn.query(q)
  File "C:\Program Files\Python36\lib\site-packages\pymysql\connections.py", line 517, in query 
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "C:\Program Files\Python36\lib\site-packages\pymysql\connections.py", line 732, in _read_query_result 
    result.read()
  File "C:\Program Files\Python36\lib\site-packages\pymysql\connections.py", line 1075, in read 
    first_packet = self.connection._read_packet()
  File "C:\Program Files\Python36\lib\site-packages\pymysql\connections.py", line 684, in _read_packet 
    packet.check_error()
  File "C:\Program Files\Python36\lib\site-packages\pymysql\protocol.py", line 220, in check_error 
    err.raise_mysql_exception(self._data)
  File "C:\Program Files\Python36\lib\site-packages\pymysql\err.py", line 109, in raise_mysql_exception 
    raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'set @b=null;select @a:=if(@b=num,@a+1,1) as rk,@b:=num from logs' at line 1")

您正在尝试使用单个cursor.execute()调用运行多个 SQL 语句。 每个 SQL 语句都以;结尾 . MySQL 错误消息显示您的输入从它不理解的第一个 SQL 开始,而这恰好是您的第二个语句set @b=null; .

为每个不同的 SQL 语句调用cursor.execute()一次,或者使用

result=cursor.execute(
   "set @a=0;set @b=null;select @a:=if(@b=num,@a+1,1) as rk,@b:=num from logs;",
   multi = True)

我推荐每次通话一个语句的解决方案,因为它更容易排除故障。

更多信息在这里。 通过 sqlalchemy 执行时启用执行多个语句

相关问答中所述,您需要将client_flag=CLIENT.MULTI_STATEMENTS传递给 PyMySQL .connect .connect()方法。 您可以通过使用.create_engine()creator=参数来做到这一点:

import pymysql
from pymysql.constants import CLIENT
import sqlalchemy as sa


def get_pymysql_connection():
    return pymysql.connect(
        host="127.0.0.1",
        port=3307,
        user="scott",
        password="tiger",
        database="mydb",
        client_flag=CLIENT.MULTI_STATEMENTS,
    )


engine = sa.create_engine("mysql+pymysql://", creator=get_pymysql_connection)
c = engine.raw_connection()
cursor = c.cursor()
result = cursor.execute(
    "set @a=0;set @b=null;select @a:=if(@b=num,@a+1,1) as rk,@b:=num from logs;"
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM