Не удается найти хранимую процедуру - терминал показывает, что она существует - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь погрузиться в разработку веб-приложений. Я работаю над простым приложением, которое позволяет людям зарегистрироваться, создать учетные данные пользователя, а затем заполнить список участников. Сейчас у меня проблемы с добавлением новых пользователей в базу данных MySQL. Когда я выбираю нужную базу данных, я использую SHOW CREATE PROCEDURE, и моя процедура печатается в терминале. Однако, когда я запускаю свое приложение и тестирую регистрацию - консоль браузера продолжает говорить:

"{" error ":" (1305, u'PROCEDURE tbl_user.sp_createUser не существует ') "}.

Я вижу это в терминале, но не могу заставить мое приложение найти его. Я подозреваю, что хранимая процедура находится в неправильной базе данных, но я не могу найти четких инструкций о том, как подтвердить, в какой БД находится моя процедура.

Я пытался просмотреть все базы данных, которые у меня есть. Я даже попытался сбросить соединение и убедиться, что могу найти процедуру в терминале, прежде чем пытаться протестировать свое приложение. Я нахожу его, но не могу заставить мое приложение работать.

Код приложения Python:

'''python 
mysql = MySQL()

#MySQL configurations
app.config['MYSQL_DATABASE_USER'] = 'root'
app.config['MYSQL_DATABASE_PASSWORD'] = 'peace2you'
app.config['MYSQL_DATABASE_DB'] = 'BucketList'
app.config['MYSQL_DATABASE_HOST'] = 'localhost'
mysql.init_app(app)

@app.route("/")
def main():
    return render_template('index.html')

@app.route("/showSignup")
def showSignup():
    return render_template('signup.html')

@app.route("/signUp",methods=['POST','GET'])

def signUp():
    try:
    # read the posted values from the UI
        _name = request.form['inputName']
        _email = request.form['inputEmail']
        _password = request.form['inputPassword']


        if _name and _email and _password:

        #all good, lets call MySQL
            with closing(mysql.connect()) as conn:
                with closing(conn.cursor()) as cursor:
                    _hashed_password = generate_password_hash(_password)
                    cursor.callproc('tbl_user.sp_createUser',(_name,_email,_hashed_password))
                    data = cursor.fetchall()

                    if len(data) is 0:
                        conn.commit()
                        return json.dumps({'message':'User created successfully !'})
                    else:
                        return json.dumps({'error':str(data[0])})
        else:
            return json.dumps({'html':'<span>Enter the required fields</span>'})

    except Exception as e:
        return json.dumps({'error':str(e)})

'''

'''mysql from commandline
show create procedure `tbl_user.sp_createUser`
    -> ;
+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure              | sql_mode                                                                                                              | Create Procedure                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | character_set_client | collation_connection | Database Collation |
+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| tbl_user.sp_createUser | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`localhost` PROCEDURE `tbl_user.sp_createUser`(
    IN p_name VARCHAR(20),
    IN p_username VARCHAR(20),
    IN p_password VARCHAR(20)
)
BEGIN
    if ( select exists (select 1 from tbl_user where user_username = p_username) ) THEN

        select 'Username Exists !!';

    ELSE

        insert into tbl_user
        (
            user_name,
            user_username,
            user_password
        )
        values
        (
            p_name,
            p_username,
            p_password
        );

    END IF;
END | utf8mb4              | utf8mb4_0900_ai_ci   | utf8mb4_0900_ai_ci |
+------------------------+-----------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)


'''

Я ожидаю, что на консоли будет отображаться «Пользователь успешно создан», но я продолжаю получать:

{"error": "(1305, u'PROCEDURE tbl_user.sp_createUser не существует ')"}.

Любая помощь или понимание, которое вы могли бы оказать, было бы фантастическим! Спасибо

1 Ответ

0 голосов
/ 03 июля 2019

В комментарии вы упомянули, что хотите создать процедуру с именем sp_createUser в таблице tbl_user. Это не так, как она работает.

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

Процедура просто находится в базе данных и может вызываться без ссылки на таблицу.Вам просто нужно указать базу данных, если она отличается от текущей базы данных, в виде databasename.procedurename.Это то, что вы сделали в своем вызове Python: вы попытались выполнить процедуру с именем sp_createUser в базе данных tbl_user, которая, по-видимому, не существует.

В MyQSL Workbench вы использовали обратные ссылки для создания и проверки процедуры, show create procedure `tbl_user.sp_createUser`.Таким образом, вы сказали MySQL принимать строку буквально, например, создать процедуру с точкой в ​​имени.И ты в принципе никогда не хочешь этого делать.

Подводя итог: создайте процедуру, используя create procedure sp_createUser ..., и вызовите ее, используя cursor.callproc('sp_createUser', ....

Вы можете включить имя базы данных, например, create procedure BucketList.sp_createUser ... и / или cursor.callproc('BucketList.sp_createUser', ..., хотя, если вы это сделаете, это может усложниться, если вы хотите запустить свое приложение в другой базе данных, например, в тесте.установка с другим именем.

...