61218


ストアドプロシジャーを作成する SQL を AWS Lambda python で実行したいのですが

ストアドプロシジャーを初めて使うので  
後述のような最低限のテストコードを書いてローカルで実行してみると文法エラーがでます  
(Lambda 上でも同じエラーになります）

[code]

      sql ='''
    create temporary table test (
      x int
    )
    '''
    
[/code]

だと動くので接続情報や実行環境は問題ないと思われますし  
同じ MySQL をみてる workbench に SQL の中だけ  
貼り付けると動くので SQL の中も問題ないはずなのですが

何が悪いのでしょうか

[code]

    #-*- using:utf-8 -*-
    
    import pymysql
    import configparser
    config = configparser.ConfigParser()
    config.read('mysql.ini', encoding='utf-8')
    config = config['DEFAULT']
    
    mysql = pymysql.connect(host    =config['db_host'],
                            user    =config['db_username'],
                            password=config['db_password'],
                            db      =config['db_name'],
                            charset =config['db_charset'])
    
    with mysql.cursor() as cursor:
      sql ='''
    DELIMITER //
    CREATE FUNCTION echo(n int)
    RETURNS int
    BEGIN
      RETURN n;
    END//
    DELIMITER ;
    '''
      cursor.execute(sql)
    
[/code]

エラーメッセージ

[code]

    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 'DELIMITER //\nCREATE FUNCTION echo(n int)\nRETURNS int\nBEGIN\n  RETURN n;\nEND//\nDEL' at line 1")
    
[/code]

python 3.7 です


CC BY-SA 4.0
2019-12-06T11:51:20.480
61172
2019-12-07T12:54:57.723
2019-12-06T11:56:52.863
question
python mysql pymysql
ストアドプロシジャーを PyMySQL から実行できない


ややこしいのですが、DELIMITER はクエリではなくて mysql クライアントのコマンドなのです。  
mysql コマンドが `;` をクエリの区切りと認識してしまうため、それを別の文字列に置き換えるのが DELIMITER です。

なので、DELIMITER を書かずに、そのまま

[code]

    CREATE FUNCTION echo(n int)
    RETURNS int
    BEGIN
      RETURN n;
    END
    
[/code]

とだけ書けばいいと思います。


CC BY-SA 4.0
2019-12-07T12:54:57.723
61218
2019-12-07T12:54:57.723
3249
61172
answer