20

create_function_foocreate function ステートメントを含むDDL オブジェクト ( ) があります。その最初の行に入れましDROP FUNCTION IF EXISTS foo;たが、次のようにengine.execute(create_function_foo)返します:

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

multi=Trueのパラメーターとして入れましたがcreate_engine、機能engine.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
""")

どこに置けばいいですか?

4

3 に答える 3

25

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

于 2013-11-05T07:08:56.677 に答える
3

DBAPI複数の結果セットの処理など、一部の関数にアクセスする際に SQLAlchemy が一般的な方法を提供しない場合があります。このような場合、生の DBAPI 接続を直接処理する必要があります。

SQLAlchemy のドキュメントから:

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()

次に示すように、mysql コネクタを使用して同じことを行うこともできます。

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))
于 2018-08-22T00:13:56.243 に答える