使用python第一次使用sqlite,错误'游标未定义'

时间:2013-10-26 01:26:11

标签: python sqlite

我是Python新手并尝试使用sqlite3创建一个简单的电话簿。我的问题是我有一个装饰器将所有字符串更改为小写,所以当我调用displayPerson函数时,它会将所有内容更改为小写。我的问题是,我可以将ben.displayPerson中的属性元组返回到'conn.execute insert values'语句,而不是将ben.name,ben.age,ben.phone(这会忽略装饰器)。

#A decorator to correct uppercase strings
def lowercasewrapper(func):
    def wrapper(*args, **kwargs):
        return [item.lower() for item in func(*args, **kwargs)]
    return wrapper

class People():
    numofpeeps = 0
    def __init__(self, name, age, phone, fblink):
        self.name=name
        self.age=age
        self.phone=phone
        self.fblink=fblink
        People.numofpeeps += 1


    @lowercasewrapper 
    def displayPerson(self): 
        return self.name, self.age, self.phone, self.fblink


ben=People("bEn", "10 years old", "503-405-4021", "http://facebook.com/ben")


#sqlite section

import sqlite3
conn = sqlite3.connect('addressbook.db')
cur=conn.cursor()
conn.execute('''
     CREATE TABLE people(name TEXT,
                   age TEXT, phone TEXT, fblink TEXT)''')
conn.execute("insert into people values (?, ?, ?, ?)", (ben.displayPerson))
cur.close()
conn.commit()
conn.close()

我在python解释器中遇到的错误说:

line 33, in <module>
conn.execute("insert into people values (?, ?, ?, ?)", (ben.displayPerson))
ValueError: parameters are of unsupported type

注意:如果我执行conn.execute,则此方法有效     (“插入人值(?,?,?,?)”,(ben.name,ben.age,ben.phone))

但是,我想事先使用装饰器,我无法弄清楚如何做到这一点。

1 个答案:

答案 0 :(得分:2)

问题是你没有调用 ben.displayPerson,你只是引用了这个方法本身。

只需将其更改为:

conn.execute("insert into people values (?, ?, ?, ?)", (ben.displayPerson()))

但是,你也应该摆脱那些额外的括号:

conn.execute("insert into people values (?, ?, ?, ?)", ben.displayPerson())

在括号中加上一个值什么都不做,除非让人类读者混淆,认为你在不知道的情况下将值包装在1项元组中。*


*在某些情况下,如果值是生成器表达式或lambda表达式,则需要在其周围添加额外的括号以防止解析器混淆。对于非常复杂的表达式,它可能使事情更具可读性。当然,对于元组中的多个值,括号几乎不会受到伤害。但是对于单一的,简单的价值,不要这样做。