使用 Flask 方法访问 MySQL 连接时出现问题

Posted

技术标签:

【中文标题】使用 Flask 方法访问 MySQL 连接时出现问题【英文标题】:Problem accessing MySQL connection out of Flask methods 【发布时间】:2019-09-10 07:12:43 【问题描述】:

我正在开发一个集成了 mysql (flask-mysqldb) 和 MQTT (flask-mqtt) 的 Flask 应用程序。我可以从 Flask 方法(例如 @app.route('/'))执行任何 DB 操作,但如果我在收到消息时尝试从 MQTT 方法执行此操作(例如 @mqtt.on_message()),它什么也不做。最后一种方法非常有效,因为它接收并在日志中显示收到的消息。

我有一个执行数据库操作的方法,取决于我从哪里调用它,它是否有效。我猜应该是mysql对象的原因,但具体我也不知道。

这是我正在使用的代码(只是问题):

@mqtt.on_message()
def handle_mqtt_message(client, userdata, message):
    print('New message '.format(message.payload.decode()))
    storeDB('test') #Here it doesn't work


################## Methods ###########################


def storeDB(param_text):
    cur = mysql.connection.cursor()
    cur.execute(
        'INSERT INTO contacts (fullname, phone, email) VALUES (%s,%s,%s)', (param_text, param_text, param_text))
    mysql.connection.commit()

###################### FLASK #########################
@app.route('/')
def index():
    storeDB('temp') #Here it works
    return 'Hello World'

如果我访问localhost,它会在浏览器中显示“Hello World”文本并更新数据库;否则,如果我收到一条 MQTT 消息,它会显示在终端上,但不会更新数据库。 谢谢。

【问题讨论】:

好吧,我猜这个问题来自flask-mysqldb 包。我现在已经使用原生 MySQLdb Python 包 (MySQLdb) 进行了尝试,它运行良好(有点“棘手”,但工作正常,正是我所期望的)。我知道这本身不是一个解决方案,因为我正在使用另一个包,但它是使它工作的另一种方法。 【参考方案1】:

这就是我使用MySQLdbpackage 的工作方式:

import MySQLdb

try:
    db = MySQLdb.connect("HOST", "USER", "PASS", "DB")
except:
    print("Problem creating DB connection")
    sys.exit()

cursor = db.cursor()

def storeDB(param_text1, param_text2, param_text3):
    query = """INSERT INTO `DB`.`TABLE` (`fullname`, `phone`, `email`) VALUES ('""" + \
        param_text1+"""','"""+param_text2+"""','"""+param_text3+"""');"""

    try:
        cursor.execute(query)
        db.commit()
        print('DB updated')
    except:
        db.rollback()
        print("Problem updating DB :(")

【讨论】:

以上是关于使用 Flask 方法访问 MySQL 连接时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

将行插入 MySQL 表时出现 pymysql.err.ProgrammingError 错误(使用 Python、Flask、ClearDB)

将 MySQL 连接器与 Python 一起使用时出现 SSL 连接错误

MySQL 7.0.6-IR3 版本尝试连接数据库时出现问题

111:尝试连接到 AWS EC2 实例上的 Flask 应用程序时出现连接被拒绝错误

Navicat连接MySQL8+时出现2059报错

找不到 MySQL - 尝试从命令行访问 MySQL 时出现“找不到命令”错误