提问者:小点点

Python脚本在尝试MariaDB时使AssertionError


我有这段代码,它从连接到树莓上的帽子中收集数据。 运行时会出现以下错误:

[51.57, 22.30, 1002.01]
Traceback (most recent call last):
  File "dbWriter.py", line 45, in <module>
    write2DB(record)
  File "dbWriter.py", line 26, in write2DB
    assert len(values) == 3
AssertionError

我绝不是程序员,我只是瞎折腾。 它的目的是将“记录”保存到数据库中,然后在apache2服务器上实时读取和更新。 感谢所有的帮助。

import mysql.connector
from itertools import repeat
import sys
import bme680
import time

try:
   sensor = bme680.BME680(bme680.I2C_ADDR_PRIMARY)
except IOError:
   sensor = bme680.BME680(bme680.I2C_ADDR_SECONDARY)

sensor.set_humidity_oversample(bme680.OS_2X)
sensor.set_pressure_oversample(bme680.OS_4X)
sensor.set_temperature_oversample(bme680.OS_8X)
sensor.set_filter(bme680.FILTER_SIZE_3)

mydb = mysql.connector.connect(
    host='localhost',
    user='pi',
    passwd='pass',
    database='weatherDB'
)
mycursor = mydb.cursor()

def write2DB(values):
    assert len(values) == 3
    sqlText = '''INSERT INTO data(humidity, temperature, pressure) VALUES({},{}, })'''.format(values[0], values[1], values[2])
    mycursor.execute(sqlText)
    mydb.commit()

for _ in repeat(None):
   sensor.get_sensor_data()
   output_humi = '{0:.2f}'.format(
       sensor.data.humidity)
   output_temp = '{0:.2f}'.format(
       sensor.data.temperature)
   output_pres = '{0:.2f}'.format(
       sensor.data.pressure)
   record = []
   record = ('[' + (output_humi) + ', ' + (output_temp) + ', ' + (output_pres) + ']')
   print(record)
   write2DB(record)
   time.sleep(10)
   pass

共1个答案

匿名用户

你有:

record = ('[' + (output_humi) + ', ' + (output_temp) + ', ' + (output_pres) + ']')

record的计算结果为单个字符串,而不是3个元素的列表,因此是异常。

将上述内容更改为:

record = [output_humi, output_temp, output_pres]

您的格式规范中还缺少一个{。它应该是:

sqlText = '''INSERT INTO data(humidity, temperature, pressure) VALUES({},{}, {})'''.format(values[0], values[1], values[2])

另一种办法是使用事先准备好的声明:

sqlText = 'INSERT INTO data(humidity, temperature, pressure) VALUES(%s, %s, %s)'
mycursor.execute(sqlText, values)

在上述情况下,您将传递实际字符串作为值。 我不知道列是如何定义的,但没关系。 如果将它们定义为浮点值或十进制值,则字符串将转换为正确的类型。