Confirmando dados do Tweepy para um banco de dados sqlite3, não importa o que eu faça, o banco de dados permanece vazio

StackOverflow https://stackoverflow.com/questions/8408228

  •  29-10-2019
  •  | 
  •  

Pergunta

Código:

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!"

Voltei e adicionei uma linha do código relacionado ao banco de dados por vez para tentar descobrir o que o quebra, e parece ser a adição do c.execute() linha.Eu simplesmente não consigo descobrir o que estou perdendo!

Foi útil?

Solução

O caminho para o banco de dados deve ser um argumento para o seu script, não codificado. Deve ser fornecido à sua classe cada vez que a classe for instanciada, NÃO quando sua classe for criada. No entanto, não está claro que essa seja a causa do seu problema, ainda não é exatamente qual é o problema:

Seu título indica que você não pode obter nada escrito em seu banco de dados, mas o corpo da pergunta implica que algo "quebra" quando você adiciona c.execute - o que é correto? Quais são os sintomas quando ele "quebra"?

Sua tentativa \ yadda \ except \ pass está ignorando silenciosamente todas as exceções possíveis - não faça isso! Remova a tentativa \ exceto \ pass deixando apenas o yadda, responda às perguntas acima, e deixe-nos saber o resultado.

ATUALIZAÇÃO: sua instrução c.execute () é um choque. Tornando-o legível sem rolar, é equivalente a isto:

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

Em outras palavras, você tem um parêntese direito totalmente mal colocado. O resultado é sintaticamente válido, mas causa uma exceção no tempo de execução.

Pior: você está se preparando para um ataque de injeção de SQL. Use parâmetros em vez de formatação de string:

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

Um bônus dessa abordagem é que ela deve ser executada muito mais rápido, pois o mecanismo não precisará analisar (ou ter seu cache inundado por) uma instrução SQL tipicamente diferente para cada linha escrita.

Outras dicas

Tente retirar as referências próprias da classe ou use um __init__ função para inicializar 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

Eu concordo com o machin, porém, passe seus objetos de conexão e cursor como parâmetros quando você inicializar o objeto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top