Передача данных из Tweepy в базу данных sqlite3, независимо от того, что я делаю, база данных остается пустой - PullRequest
3 голосов
/ 07 декабря 2011

Код:

import time
import tweepy
import sqlite3

class Listener(tweepy.StreamListener):

    conn = sqlite3.connect('/home/daniel/Desktop/activeSites/djeep/djeep.db')

    def on_status(self, status):
        try:
            c = self.conn.cursor()
            c.execute("""insert into feed_post values (%r,'%s','%s',%d)""") % (status.id, status.text, status.author.screen_name, status.created_at)
            self.conn.commit()
        except:
            pass


    def on_error(self, status_code):
        print 'An error has occured! Status code = %s' % status_code
        return True  # keep stream alive

    def on_timeout(self):
        print 'timeout...'

def main():
    auth = tweepy.OAuthHandler('C_KEY', 'C_SECRET') 
    auth.set_access_token('ACCESS_TOKEN', 'ACCESS_SECRET') 
    stream = tweepy.Stream(auth=auth, listener=Listener())     
    stream.filter(track=('baseball',)) 

if __name__=="__main__":
    try:
        main()
    except KeyboardInterrupt:
        print "See ya!"

Я вернулся и добавил по одной строке кода, связанного с базой данных, за раз, чтобы попытаться выяснить, что его нарушает, и, кажется, это добавлениеЛиния 1004 *.Я просто не могу понять, что мне не хватает!

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Путь к базе данных должен быть аргументом вашего скрипта, а не жестко закодированным. Он должен предоставляться вашему классу каждый раз, когда создается экземпляр класса, а НЕ при его создании. Однако не очевидно, что это является причиной вашей проблемы, но не совсем так:

Ваш заголовок указывает, что вы ничего не можете записать в свою базу данных, но тело вопроса подразумевает, что что-то "ломается", когда вы добавляете c.execute - что правильно? Каковы симптомы, когда он «ломается»?

Ваша попытка \ yadda \ кроме \ прохода молча игнорирует все возможные исключения - не делайте этого! Удалите попытку \ кроме \ прохода, оставив только yadda, ответьте на вышеуказанные вопросы и дайте нам известен результат.

ОБНОВЛЕНИЕ: Ваш оператор c.execute () шокирует. Делаем его разборчивым без прокрутки, это эквивалентно следующему:

(
    c.execute("""insert into feed_post values (%r,'%s','%s',%d)""")
    % 
    (status.id, status.text, status.author.screen_name, status.created_at)
)

Другими словами, у вас есть правильная скобка, которая неуместна. Результат синтаксически действителен, но обязательно вызовет исключение во время выполнения.

Хуже того: вы настраиваете себя для атаки SQL-инъекцией. Используйте параметры вместо форматирования строки:

sql = "insert into feed_post values (?,?,?,?)"
params = (status.id, status.text, status.author.screen_name, status.created_at)
c.execute(sql, params)

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

0 голосов
/ 07 декабря 2011

Попробуйте удалить ссылки на себя из класса или используйте функцию __init__ для инициализации self.conn

def __init__(self):
    self.conn = sqlite3.connect('/home/daniel/Desktop/activeSites/djeep/djeep.db')

def on_status(self, status):
    try:
        c = self.conn.cursor()
        c.execute(SQL...)
        self.conn.commit()
    except:
        pass

Я согласен с machin, однако, передавайте ваше соединение и объекты курсора в качестве параметров при инициализации объекта.

...