第一次在这里蟒蛇用户,温柔......; - )
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没有得到一个诅咒,或者自我不正确?
不确定我在做什么就在这里......
欢呼声
答案 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, ))
最后一件事“诅咒”拼错了:)