使用 Python/Flask 进行 MySQL 查询

Posted

技术标签:

【中文标题】使用 Python/Flask 进行 MySQL 查询【英文标题】:MySQL query with Python/Flask 【发布时间】:2019-04-03 17:53:07 【问题描述】:

刚刚回到一个停滞不前的项目。我正在学习 Python(使用 Flask)并使用一个也使用了一些 mysql 的脚本。

我在 Raspberry Pi 上运行了一些 Python,它可以检测蓝牙以查看是否有人进出。这会写入 MySQL 表并且工作正常。

我正在尝试回读行,目前正在使用它:

conn = MySQLdb.connect(host="localhost", user = "xxxxxxx", passwd = "xxxxxxxx", db = "mydb")
                cursor = conn.cursor()
                cursor.execute("select status from occupants WHERE id = '1'")
                data = cursor.fetchall()
                conn.commit()
                if (data[0] == "In"):
                    result = "In"

在我的模板文件中,我有这个:

% if result == "In" %
   Do stuff
% else %
   Do other stuff

目前结果始终为“无”...可能是由于:

def index(iframe=None, result=None, targettemp=None, status=None, inttemp=None, result1=None, result2=None, result3=None, hiveSessionId=None):

我已经进行了大量搜索,但我什至不知道我是否在寻找正确的东西。

这是非常可怕的错误,不值得保存,还是一个简单的错误?

编辑:这是我的 Python 脚本中的整个路径:

我已经更改了一点,只是将结果设置为 1。这只是测试它们是否被传递到模板,该模板有效。我还在结果中添加了一个 else。所以现在当我查看我的输出时,它显示“Blah”,这证明了结果!=“In”,即使我可以看到它在 MySQL 表中。

@app.route('/')
def index(iframe=None, result=None, targettemp=None, status=None, inttemp=None, result1=None, result2=None, result3=None, hiveSessionId=None):
        import requests
        import bluetooth
        import time
        import datetime
        import MySQLdb
    iframe = "http://xx.xx.xx.xx:xxxx/cam/min.php"
    url = "https://api.prod.bgchprod.info:443/omnia/users"
        if 'hiveSessionId' in session:
                hiveSessionId = session['hiveSessionId']
                headers = 
                    'Content-Type': "application/vnd.alertme.zoo-6.1+json",
                    'Accept': "application/vnd.alertme.zoo-6.1+json",
                    'X-Omnia-Client': "Hive Web Dashboard",
                    'X-Omnia-Access-Token': hiveSessionId,
                    'Cache-Control': "no-cache"
                    
                response = requests.request("GET", url, headers=headers)
                data=response.json()
                if 'errors' in data:
                        return redirect(url_for('hivelogin'))
                conn = MySQLdb.connect(host="localhost", user = "xxxxx", passwd = "xxxxxx", db = "mydb")
                cursor = conn.cursor()
                cursor.execute("select status from occupants WHERE id = '1'")
                data = cursor.fetchall()
                conn.commit()
                if (data[0] == "In"):
                    result = "In"
                else:
                    result = "Blah"
                result1 = 1
                result2 = 1
                result3 = 1

        url = "https://api-prod.bgchprod.info:443/omnia/nodes/0e5f20fb-ab13-4d43-89ed-ec2481ea9012"
                payload = "\n    \"nodes\": [\n        \"attributes\": \n            \"state\": \"targetValue\": \"OFF\"\n        \n    ]\n"
                headers = 
                'Content-Type': "application/vnd.alertme.zoo-6.1+json",
                'Accept': "application/vnd.alertme.zoo-6.1+json",
                'X-Omnia-Client': "Hive Web Dashboard",
                'X-Omnia-Access-Token': hiveSessionId,
                'Cache-Control': "no-cache",
        
                responsetemp = requests.request("PUT", url, data=payload, headers=headers)
                data=responsetemp.json()
                inttemp  = (data['nodes'][0]['attributes']['temperature']['reportedValue'])
                inttemp = round(inttemp,1)
        targettemp  = (data['nodes'][0]['attributes']['targetHeatTemperature']['reportedValue'])
        status  = (data['nodes'][0]['attributes']['stateHeatingRelay']['reportedValue'])
        return render_template('inout.html', iframe=iframe, status=status, targettemp=targettemp, inttemp=inttemp, hiveSessionId=hiveSessionId, result=result, result1=result1, result2=result2, result3=result3)
        return redirect(url_for('hivelogin'))

【问题讨论】:

你并没有展示你如何实际尝试将值从视图函数传递到模板,我们需要查看实际的 Flask 函数及其返回的内容。不相关但 conn.commit() 对于不修改值的查询(即 SELECT)不是必需的 啊!我只是将我的代码更改为 result = (data[0]),当我显示结果时它显示 ('In',)。所以它肯定是在阅读表格,但我不知道为什么它不只是在没有括号和其他东西的情况下显示。 【参考方案1】:

元组永远不等于字符串。这就是为什么你的resultBlah 的原因。而 con.commit() 是不必要的,因为一般情况下查询不需要提交。但是如果你需要禁用查询缓存。 How to disable query cache with mysql.connector

cur.execute("select msg from test limit 2")
data = cur.fetchall()
print(data)  # (('test',), ('test',))
if (data[0] == "test"): #data[0] ('test',)
    result = "In"
else:
    result = "Blah"
print(result) # Blah

con.commit()

【讨论】:

以上是关于使用 Python/Flask 进行 MySQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

Python+Flask+MysqL的web建设技术过程

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

Python Flask SQLAlchemy 容器无法连接到 MySQL 容器

如何在Python Flask框架中运行重复任务

Python+Flask+MySQL 连接数据库

Python+Flask+MysqL的web建设技术开发一个网站