Почему следующий код выдает исключение 0? - PullRequest
0 голосов
/ 29 мая 2020

Я использую mariadb 10, python и py mysql, чтобы собрать команду регистрации для моего сервера Discord. В mariadb у меня есть хранимая процедура со следующим синтаксисом:

DELIMITER //

CREATE PROCEDURE registerUser(IN iUser_Name varchar(50), OUT isExists bool)
BEGIN

    IF EXISTS (SELECT 1 FROM user where user_name = iUser_Name) THEN
        SET isExists = true;
    ELSE
        SET isExists = false;
        insert into user(user_name, user_create_date) VALUES(iUser_Name, curdate());
    END IF;
END //

DELIMITER ;

Цель хранимой процедуры - определить, существует ли пользователь, если да, установите isExists на true, иначе false и вставьте пользователя .

В моем сценарии python я пробовал различные решения, основанные на том, что я нашел здесь, в stackoverflow, и пытался реализовать его, но ни один из них не работал. Следующая попытка является последней попыткой, и я получаю сообщение об ошибке: Something went wrong: 0

import pymysql.cursors
...

@client.command(name="register", pass_context=True)
async def register(ctx):
    #db connection
    cnx = pymysql.connect(user='db_user'
    , password = 'pwd'
    , host='localhost'
    , database='db_name'
    , port=3306
    , cursorclass=pymysql.cursors.DictCursor)

    cursor = cnx.cursor()

    try:
        # https://stackoverflow.com/questions/24139849/mysqldb-stored-procedure-out-parameter-not-working

        cursor.callproc('registerUser', (ctx.message.author.name, 'True'))
        cursor.execute("select @_registerUser_1")
        result = cursor.fetchone()

        if result[0] == False:
            await ctx.channel.send("{}, you are all set to weekly trade.".format(ctx.message.author.mention))
        elif result[0] == True:
            await ctx.channel.send("{}, you have already registered.".format(ctx.message.author.mention))

        cnx.commit()
        cursor.close()
        cnx.close()
    except Exception as err:
        await ctx.channel.send("Something went wrong: {}".format(err))

мы будем очень признательны за любые предложения, как заставить эту вещь работать.

спасибо.

1 Ответ

0 голосов
/ 30 мая 2020

В этой документации предлагается просто использовать значение, возвращаемое вызовом #fetchone(), а не пытаться индексировать его как массив. Кажется, вы должны сравнить if result['@_registerUser_1'] == False:, еще лучше if not result['@_registerUser_1']:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...