sql - 从 Arduino 到 Raspberry pi 获取读数时出错
问题描述
我有以下代码试图从连接到 Raspberry PI 的 Arduino Uno 获取温度:
import mysql.connector as mariadb
import serial
mariadb_connection = mariadb.connect(user='IOT', password='12345678', database='iotstorage')
ser = serial.Serial('/dev/ttyACM0', 9600)
cursor = mariadb_connection.cursor()
cursor = mariadb_connection.cursor(buffered=True)
while 1:
t = ser.readline()
t = str(t)
sql = "INSERT INTO example (temperature) VALUES (%s)" %(t)
cursor.execute(sql)
mariadb_connection.commit()
cursor.execute("SHOW DATABASES")
它给了我以下错误:
回溯(最后一次调用):文件“/home/pi/Desktop/procedure/sketch_dec03.py”,第 25 行,在 cursor.execute(sql) 文件“/usr/lib/python3/dist-packages/mysql/connector /cursor.py”,第 569 行,在执行 self._handle_result(self._connection.cmd_query(stmt)) 文件“/usr/lib/python3/dist-packages/mysql/connector/connection.py”,第 553 行,在cmd_query 结果 = self._handle_result(self._send_cmd(ServerCmd.QUERY, query)) 文件“/usr/lib/python3/dist-packages/mysql/connector/connection.py”,第 442 行,在 _handle_result 中引发 errors.get_exception(数据包)mysql.connector.errors.ProgrammingError:1064(42000):您的SQL语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 'b'5.19\r\n')' 附近使用的正确语法
我将如何解决这个问题?
解决方案
您正在尝试插入一个数字,而来自串行设备的值不是数字。
你可以
- 在参数标记 %s 周围的 SQL 语句中添加引号:
"INSERT INTO example (temperature) VALUES ('%s')" %(t)
- 或将串行设备中的值转换为有效的十进制数。
一些代码注释:
- 不要使用 mariadb 作为包模块名称,这可能与 MariaDB Connector/Python 冲突
- 创建光标一次,而不是使用不同参数创建两次
- 你真的想在插入温度值后列出所有数据库吗?!
推荐阅读
- pine-script - 关于 strategy.entry 函数的“id”
- java - Spring data jpa events:如何仅在特定字段更改时才进行事件?
- javascript - Javascript数组操作以返回元素的交集
- unity3d - unity - 与刚体错误一起跳跃
- javascript - google 自动播放限制的解决方法
- c# - .NET 如何做出构建时决策
- stata - 为什么我的 Stata 代码需要这么长时间才能运行?
- reactjs - 如何在反应中使用钩子更改对象的属性?
- c - 为什么“.rodata”部分的地址在运行时会发生变化?
- json - Swift JSON 日期