【问题标题】:Enable executing multiple statements while execution via sqlalchemy通过 sqlalchemy 执行时启用执行多个语句
【发布时间】:2013-11-15 23:56:08
【问题描述】:

我有一个包含创建函数语句的 DDL 对象 (create_function_foo)。在它的第一行我输入了DROP FUNCTION IF EXISTS foo;engine.execute(create_function_foo) 返回:

sqlalchemy.exc.InterfaceError: (InterfaceError) Use multi=True when executing multiple statements

我将multi=True 作为create_engineengine.execute_optionsengine.execute 的参数,但它不起作用。

注意engine 如果我的create_engine 实例

注意:我使用的是 python 3.2 + mysql.connector 1.0.12 + sqlalchemy 0.8.2

create_function_foo = DDL("""\
DROP FUNCTION IF EXISTS foo;
CREATE FUNCTION `foo`(
    SID INT
) RETURNS double
READS SQL DATA
BEGIN
  ...
END
""")

我应该把它放在哪里?

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

    multi=True 是 MySql 连接器的要求。您不能设置此标志,将其传递给 SQLAlchemy 方法。这样做:

    conn  = session.connection().connection
    cursor = conn.cursor()  # get mysql db-api cursor
    cursor.execute(sql, multi=True)
    

    更多信息在这里:http://www.mail-archive.com/sqlalchemy@googlegroups.com/msg30129.html

    【讨论】:

      【解决方案2】:

      在某些情况下,SQLAlchemy 不提供访问某些DBAPI 函数的通用方法,例如处理多个结果集。在这些情况下,您应该直接处理原始 DBAPI 连接。

      From SQLAlchemy documentation:

      connection = engine.raw_connection()
      try:
          cursor = connection.cursor()
          cursor.execute("select * from table1; select * from table2")
          results_one = cursor.fetchall()
          cursor.nextset()
          results_two = cursor.fetchall()
          cursor.close()
      finally:
          connection.close()
      

      You can also do the same using mysql connector as seen here:

      operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
      for result in cursor.execute(operation, multi=True):
        if result.with_rows:
          print("Rows produced by statement '{}':".format(
            result.statement))
          print(result.fetchall())
        else:
          print("Number of rows affected by statement '{}': {}".format(
            result.statement, result.rowcount))
      

      【讨论】:

      • sqlalchemy 解决方案似乎不起作用。一个查询有效,两个查询抛出 ProgrammingError。 sqlalchemy API 有变化吗?
      【解决方案3】:

      是的...这对我来说似乎是一个无赖。我不想使用 ORM,所以接受的答案对我不起作用。

      我这样做了:

      with open('sql_statements_file.sql') as sql_file:
          for statement in sql_file.read().split(';'):
              if len(statement.strip()) > 0:
                   connection.execute(statement + ';')
      

      然后这个 CREATE 函数失败了.... YMMV.

      【讨论】:

      • 将脚本拆分为语句的更可靠方法是使用 SQL 解析库,例如sqlparse.split(sqlparse.format(self.sql, strip_comments=True))
      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 2014-09-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多