Confirmando dados do Tweepy para um banco de dados sqlite3, não importa o que eu faça, o banco de dados permanece vazio
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!
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.