找不到存储过程-终端显示它存在

时间:2019-07-01 21:05:00

标签: mysql python-2.7 stored-procedures

我正在尝试将自己的脚趾插入Web应用程序开发中。我正在开发一个简单的应用程序,使人们可以注册,创建用户凭据,然后填写存储桶列表。现在,我在将新用户添加到MySQL数据库时遇到了麻烦。当我选择所需的数据库时,我使用SHOW CREATE PROCEDURE,并且我的过程似乎在终端中打印。但是,当我运行我的应用并测试注册时-浏览器控制台会一直说:

  

“ {”错误“:”(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)


'''

我希望控制台显示“用户创建成功”,但我一直得到:

  

{“错误”:“(1305,u'PROCEDURE tbl_user.sp_createUser不存在')”}。

您能提供的任何帮助或理解都将非常棒!谢谢

1 个答案:

答案 0 :(得分:0)

在评论中,您提到要在表tbl_user中创建一个名为sp_createUser的过程。并非如此。

可能会想到triggers,它是属于特定表的代码,但是不能像过程一样调用它们,而是在更新表时自动执行数据,例如在表格中插入一行。

过程仅位于数据库中,而无需引用表即可调用。如果数据库与当前数据库不同,您只需以databasename.procedurename的形式指定数据库。这就是您在python调用中所做的事情:您试图在数据库sp_createUser中执行一个似乎不存在的名为tbl_user的过程。

在MyQSL Workbench中,您used backticks创建并验证过程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', ...,但如果您要在其他数据库(例如,使用其他名称的测试安装。