3

コード:

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

戻って、データベース関連のコードを一度に1行追加して、何が壊れているのかを調べてみましたが、それはc.execute()行の追加のようです。何が欠けているのかわかりません!

4

2 に答える 2

2

データベースへのパスは、ハードコーディングされているのではなく、スクリプトへの引数である必要があります。クラスが作成されたときではなく、クラスがインスタンス化されるたびにクラスに提供する必要があります。ただし、それが問題の原因であるかどうかは明らかではありませんが、問題が正確に何であるかはまだわかりません。

あなたのタイトルは、データベースに何も書き込めないことを示していますが、質問の本文は、追加すると何かが「壊れた」ことを意味しますc.execute-これは正しいですか?それが「壊れた」ときの症状は何ですか?

try \ yadda \ exception \ passは、考えられるすべての例外を黙って無視しています。そうしないでください。yaddaだけを残してtry\exception \ passを削除し、上記の質問に答えて、結果をお知らせください。

更新: 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ステートメントをエンジンが解析する(またはキャッシュをいっぱいにする)必要がないため、実行速度が大幅に向上することです。

于 2011-12-06T23:55:48.837 に答える
0

クラスから自己参照を取り出すか、__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

オブジェクトを初期化するときに、接続オブジェクトとカーソルオブジェクトをパラメーターとして渡します。

于 2011-12-06T23:41:00.320 に答える