插入SQLite数据库时,str对象不可调用

时间:2015-06-14 01:52:32

标签: python string sqlite

我正在使用在Raspberry Pi 2上运行的单线温度传感器研究温度传感器网络。我正在关注this tutorial并且随着我的进展,我意识到他的设置是针对一个温度传感器,而我的设置需要使用多个传感器。

由于有多个传感器,我还需要能够将传感器彼此区分开来。为此,我想在SQLite表中有3列。我在执行Python脚本时遇到错误,该脚本应该记录传感器的读数,日期和时间以及传感器名称。

这是问题,当我配置python脚本向表中写入三个值时,我收到一个错误。

以下是执行

时出错的代码
#!/usr/bin/env python

import sqlite3

import os
import time
import glob

# global variables
speriod=(15*60)-1
dbname='/var/www/templog.db'

# store the temperature in the database
def log_temperature(temp):

    conn=sqlite3.connect(dbname)
    curs=conn.cursor()
    sensor1 = 'Sensor1'

    curs.execute("INSERT INTO temps values(datetime('now'), (?,?))" (temp, sensor1)) 

    # commit the changes
    conn.commit()

    conn.close()

2 个答案:

答案 0 :(得分:4)

"INSERT INTO temps values(datetime('now'), (?,?))" (temp, sensor1)

打破这一点,你会看到这会创建一个字符串,然后Python的括号显示为函数调用。然而,这是荒谬的,因为你有一个你试图调用的字符串,就像它是一个函数。因此,你得到的关于str无法调用的错误,如果你没有Python经验,这肯定有点神秘。基本上你错过了一个逗号:

curs.execute("INSERT INTO temps values(datetime('now'), (?,?))", (temp, sensor1)) 

现在,您将正确填写?个占位符。

通常“str不可调用”错误将是错误的结果,例如这个或重复的变量名称(你认为你正在调用一个函数,但变量确实包含一个字符串),所以从查找开始当你看到这种类型的错误时会遇到这些问题。

答案 1 :(得分:2)

你必须在那里放,

curs.execute("INSERT INTO temps values(datetime('now'), (?,?))" , (temp, sensor1)) 

来自documentation

  

?作为占位符放在您想要使用值的任何位置,然后在游标的{{ 第二个参数 中提供一个值元组。 1}}方法

如您所见,您需要提供元组作为函数execute()的第二个参数