python - 'str'对象没有属性'execute'

时间:2010-10-23 21:51:11

标签: python sqlite

第一次在这里蟒蛇用户,温柔......; - )

OSX上的Python 2.6

有一个类只有一些围绕sqlite的包装器...这里是

from pysqlite2 import dbapi2 as sqlite

class SqliteDB:
    connection = ''
    curser = ''

    def connect(self):
        try:
            self.connection = sqlite.connect("pagespeed.sqlite")
            self.curser = self.connection.cursor()
         except sqlite.Error, e:
            print "Ooops: ", e.args[0]

    def find_or_create(self, table, column, value):
        self.curser.execute("SELECT id FROM ? WHERE ?=? LIMIT 1", (table, column, value))
        records = self.curser.fetchall()
        if records.count() == false:
            self.curser.execute("INSERT into ? SET ?=?", (table, column, value))
            self.curser.execute("SELECT id FROM ? WHERE ?=? LIMIT 1", (table, column, value))
        print records

我在一个单独的文件中将其称为

import sqlitedb

def main():
    db = sqlitedb.SqliteDB()
    db.connect    
    url_id = db.find_or_create('urls', 'url', 'http://www.example.com')

然而我收到此错误,

Traceback (most recent call last):

  File "update_urls.py", line 17, in <module>

  main()

  File "update_urls.py", line 11, in main

  url_id = db.find_or_create('urls', 'url', 'http://www.example.com')

  File "....../sqlitedb.py", line 16, in find_or_create

  self.curser.execute("SELECT id FROM ? WHERE ?=? LIMIT 1", (table, column, value))

AttributeError: 'str' object has no attribute 'execute'

所以它几乎就像self.curser没有得到一个诅咒,或者自我不正确?

不确定我在做什么就在这里......

欢呼声

4 个答案:

答案 0 :(得分:7)

我不知道出了什么问题,但至少:

db.connect  

应该是

db.connect()

e.g。调用函数。

行。 S.Lott得到了答案,我刚发现另一个错误:)

答案 1 :(得分:4)

不要这样做。

class SqliteDB:
    connection = ''
    curser = ''

它不会“声明”任何变量。这不是C ++或Java。

这样做。

class SqliteDB:
    def __init__( self ):
        self.connection = None
        self.cursor= None

答案 2 :(得分:1)

第三个错误:

self.curser.execute("SELECT id FROM ? WHERE ?=? LIMIT 1", (table, column, value))

您无法参数化表名和列名。所有可以参数化的东西都可以是SQL语法中的表达式。你需要做这样的事情:

sql = "SELECT id FROM %s WHERE %s = ? LIMIT 1" % (table, column)
self.curser.execute(sql, (value, ))

哦,是的,保存一系列评论:或使用现代string.format(data)方法代替古董string % data运算符。

答案 3 :(得分:1)

我还要补充说这不起作用:

curser.execute("SELECT id FROM ? WHERE ?=? LIMIT 1", (table, column, value))

因为占位符(?)不适用于表名,所以如果您仍想使用表名作为参数,则应该使用字符串格式:

query = "SELECT id FROM %s WHERE %s=? LIMIT 1" % (table, column)
curser.execute(query, (value, ))

最后一件事“诅咒”拼错了:)