AttributeError:'str'对象没有属性'execute'

时间:2019-05-19 17:24:20

标签: python sql python-3.x sqlite

我想添加一个选项,但是我在哪里出错?

conn=sqlite3.connect('tutorial.db')
c=conn.cursor()

def create_table():
  c.execute('CREATE TABLE IF NOT EXISTS test (UNIX REAL, datestamp TEXT, keyword TEXT, value REAL)')

def data_entry(a,b,c,d):
  c.execute("INSERT INTO test VALUES ({}, '{}', '{}', {})".format(a,b,c,d))
  conn.commit()
  c.close()
  conn.close()
#create_table()
data_entry(1,"test","test2",3)

2 个答案:

答案 0 :(得分:3)

c中有一个局部变量def data_entry(a,b,c,d):,它作为字符串传递,并用作execute函数,最终完成"test2".execute()

该问题需要解决。一种解决方法是,如果我明确地使用curr作为代表游标的变量。

conn=sqlite3.connect('tutorial.db')
curr=conn.cursor()

def create_table(curr):
  curr.execute('CREATE TABLE IF NOT EXISTS test (UNIX REAL, datestamp TEXT, keyword TEXT, value REAL)')

#curr is the last argument
def data_entry(a,b,c,d, curr):
  curr.execute("INSERT INTO test VALUES ({}, '{}', '{}', {})".format(a,b,c,d))
  conn.commit()
  curr.close()
  conn.close()

#Explicitly passing curr to functions
create_table(curr)
data_entry(1,"test","test2",3, curr)

以后,请确保将变量命名为简短且具有描述性的变量,例如curr,并可能将字符串命名为val_1val_2等。这样您就可以从名称中知道变量是什么用于。

这是变量命名的好资源:PEP-8

答案 1 :(得分:2)

在原始代码中,局部参数c遮盖了全局光标变量c。您应该将游标和连接作为参数传递:

def create_table(cursor):
    cursor.execute('CREATE TABLE IF NOT EXISTS test (UNIX REAL, datestamp TEXT, keyword TEXT, value REAL)')


def data_entry(cursor, conn, a, b, c, d):
    cursor.execute("INSERT INTO test VALUES ({}, '{}', '{}', {})".format(a, b, c, d))
    conn.commit()
    cursor.close()
    conn.close()


conn = sqlite3.connect('tutorial.db')
cursor = conn.cursor()

create_table(cursor)
data_entry(cursor, conn, 1,"test","test2",3)