【问题标题】:AttributeError: 'str' object has no attribute 'execute'AttributeError:“str”对象没有“执行”属性
【发布时间】:2019-05-19 17:24:19
【问题描述】:

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

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)

【问题讨论】:

  • 您使用相同的名称c 来保留c=conn.cursor() 并在def data_entry(a,b,c,d): 中分配"text2" 所以最后你有"test2".execute(..)
  • 你能编辑代码吗?我不知道
  • 只需对变量之一使用不同的名称。我建议在@DeveshKumarSingh 回答中使用curr = conn.cursor()。这个名字更好地描述了它的价值。

标签: python sql python-3.x sqlite


【解决方案1】:

def data_entry(a,b,c,d): 中有一个局部变量c,它作为字符串传递,用作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

【讨论】:

  • '{}'.format(s) 容易受到 SQL 注入攻击。对于 OP 的用例来说,这可能是安全的,但未来的读者必须意识到这通常是一种不好的做法。要了解更多信息并了解一种简单、安全的替代方案,请参阅realpython.com/prevent-python-sql-injection
【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2021-10-04
    • 2019-12-02
    • 2021-09-25
    • 2014-03-04
    • 2013-09-22
    相关资源
    最近更新 更多