python - у объекта 'str' нет атрибута 'execute' - PullRequest
4 голосов
/ 24 октября 2010

Впервые пользователь Python здесь, будьте нежны ....; -)

Python 2.6 в OSX

Получил класс, у которого есть несколько оберток вокруг 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 не получает курсора или self не верен?

Не уверен, что то, что я делаю, прямо здесь ...

ура

Ответы [ 4 ]

7 голосов
/ 24 октября 2010

Я не знаю, что не так, но по крайней мере:

db.connect  

должно быть

db.connect()

например. вызовите функцию.

OK. У S.Lott был ответ, я только что нашел другую ошибку:)

4 голосов
/ 24 октября 2010

Не делайте этого.

class SqliteDB:
    connection = ''
    curser = ''

Он не "объявляет" никакие переменные.Это не C ++ или Java.

Сделайте это.

class SqliteDB:
    def __init__( self ):
        self.connection = None
        self.cursor= None
1 голос
/ 24 октября 2010

Я также добавлю, что это не будет работать:

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, ))

и последнее слово "curser" написано с ошибкой :)

1 голос
/ 24 октября 2010

И 3-й баг:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...