Gegevens commanderen van Tweepy naar een sqlite3-database, ongeacht wat ik doe, db blijft leeg

Code:

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

Ik ben teruggegaan en een regel van de database-gerelateerde code tegelijk toegevoegd om te proberen te achterhalen wat de code verbreekt, en het lijkt erop dat de regel c.execute() wordt toegevoegd. Ik kan gewoon niet achterhalen wat ik mis!

3

2 antwoord

Het pad naar de database moet een argument voor uw script zijn, niet hardcoded. Het moet aan uw klas worden verstrekt elke keer dat de klas wordt geïnstantieerd, NIET wanneer uw klas is gemaakt. Het is echter niet duidelijk dat dat de oorzaak is van uw probleem, nog niet precies wat het probleem is:

Je titel geeft aan dat je niets in je database kunt krijgen, maar de vraagstelling impliceert dat er iets "breekt" wanneer je c.execute toevoegt - wat klopt? Wat zijn de symptomen wanneer het "breekt"?

Your try\yadda\except\pass is silently ignoring all possible exceptions -- don't do that! Remove the try\except\pass leaving only the yadda, answer the above questions, and let us know the outcome.

UPDATE: Your c.execute() statement is a shocker. Making it legible without scrolling, it's equivalent to this:

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

Met andere woorden, je hebt een recht haakje dat op grove misplaatst is. Het resultaat is syntactisch geldig, maar zal zeker tijdens de uitvoering een uitzondering veroorzaken.

Erger nog: u bent bezig met een SQL-injectie-aanval. Gebruik parameters in plaats van tekenreeksopmaak:

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

Een voordeel van deze aanpak is dat deze veel sneller moet werken, omdat de engine niet per keer een typisch verschillende SQL-instructie hoeft te parseren (of zijn cache moet overspoelen door elke geschreven rij).

2
toegevoegd
Het formaat is eenvoudig: cursor.execute (sql, parameters) . Als je het op drie regels schrijft, zoals ik in mijn antwoord heb gedaan, heb je veel minder kans om het te verknoeien. Als u geen code en tijd verspilt door opzettelijk uitzonderingsrapportages te onderdrukken, zult u eerder in staat zijn om uw eigen problemen tijdens het testen te debuggen en "mensen" zullen niet weten dat u het verknoeid hebt. Het tonen van de fout is niet nuttig na de gebeurtenis (IMHO, andere kunnen verschillen). Het zou leuk zijn als je hebt aangegeven dat je de andere problemen in je code wilt oplossen, niet alleen maar een ) wilt verplaatsen naar een andere plaats in de aanstootgevende verklaring.
toegevoegd de auteur John Machin, de bron
Bedankt! Dit deed het! Daar was een syntaxisfout in mijn c.execute() - sqlite3.OperationalError: near "%": syntax error . Ik ben nooit zeker van het formaat en heb de neiging om mensen boos te maken als ik het verknoeit. Moet ik mijn vraag met de fout bijwerken?
toegevoegd de auteur Danielscottt, de bron
Whoops. Ik bedoelde het formaat voor het bewerken van vragen/opmerkingen op SO, dat is wat mensen verergert. Ik begrijp het formaat van de code!
toegevoegd de auteur Danielscottt, de bron

Probeer de zelfreferenties uit de klasse te halen of gebruik een __ init __ -functie om self.conn te initialiseren.

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

Ik ben het echter eens met machin, geef je verbinding en cursorobjecten door als parameters wanneer je het object initialiseert.

0
toegevoegd