2010-10-23 5 views
3

Первый раз, когда пользователь питона здесь, быть нежным .... ;-)питон - «ул» объект не имеет атрибута «выполнить»

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

однако я получаю эту ERR или,

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 не получает curser, или само не правильно?

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

веселит

+4

Вы можете подумайте, что забавно использовать 'curser' в качестве имени переменной, но любой, кто должен прочитать ваш код, будет проклинать ваше имя, поскольку они гасят через код, чтобы определить, является ли это опечаткой для' cursor' или нет. –

+0

Извините, моя ошибка, я шел для курсора, но мой английский так плохо ... и это мой единственный язык (английский). Плохая форма, чтобы не знать, как правильно писать в моем возрасте. – Wizzard

+0

Спасибо всем за отличную обратную связь, а как раз собираюсь уйти в течение 10 минут и проверит и присудит ответ, когда вернусь. Я также очень ценю обратную связь по другим разделам кода, очень полезно – Wizzard

ответ

7

Я не знаю, что это неправильно, но по крайней мере:

db.connect 

должен быть

db.connect() 

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

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

+3

Нет ... вы нашли ошибку, С. Лотт нашел ничто. С его коррекцией, OP будет просто получать ту же ошибку, но с 'NoneType' вместо' str'. – aaronasterling

+0

er, царапина это. OP получит атрибут AttributeError. Ввернулся мне в голову, когда мы думали о чем-то совершенно другом. Ad это хороший совет. – aaronasterling

+0

@aaronsterling: А? Вы были правы в первый раз. Ранее self.curser ссылается на атрибут класса, значение ''. После изменения S.Lott (но не исправления не вызывающего метода connect): атрибут instance, значение None. Итак: из 'AttributeError: 'str' объект не имеет атрибута' execute'' 'AttributeError: объект NoneType 'не имеет атрибута' execute'' –

4

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

class SqliteDB: 
    connection = '' 
    curser = '' 

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

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

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

Фактически, он объявляет переменные класса (доступные через 'self.connection' или' SqliteDB.connection'). Как только вы напишете «self.connection», вы создадите переменную экземпляра (это означает, что только «SqliteDB.connection» будет получать доступ к переменной класса сейчас). – Zooba

+2

Зооба: Ты очень близко. Он ничего не заявляет. Он ** создает ** переменные уровня класса, которые скрыты переменными экземпляра. Это распространенная ошибка. –

+0

большое спасибо за отзыв :) – Wizzard

1

и 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 оператора.

+0

string.format (data) был python 3 Я думал? Я перепроверяю, но из моего OP я использую 2.6. Спасибо за ответ. – Wizzard

+0

'str.format (* args, ** kwargs)' (точнее) находится в 2.6 –

+0

и вот ссылка: http://docs.python.org/release/2.6/whatsnew/2.6.html#pep -3101-advanced-string-formatting –

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

и одна последней вещь «curser» написано с ошибками :)

+0

Огромное спасибо за отзывы, мое плохое написание тоже :) thnks на ваше время – Wizzard

Смежные вопросы