2017-02-12 4 views
0

以下のコマンドを使用して、sqliteデータベースから一定量のデータを取得し、期待どおり大きな結果リストを取得し、HTMLおよびテキストドキュメントにエクスポートします。私は 'messages.conversation_id'カラムに基づいて文書に示されたテーブルを分割したいと思いますが、そうする方法を見つけることはできません。私はgroupby関数を使用しようとしましたが、大きな結果リストをソートするだけです。Sqliteデータベースのpythonクエリの結果を分割する

ありがとうございます。

connect = sqlite3.connect(sqlitedb) 
df = pd.read_sql_query("""SELECT messages._id, messages.date, messages.body, messages.conversation_id, participants_info.number, participants_info.display_name, participants_info._id 
    FROM messages 
    INNER JOIN participants_info 
    ON messages.participant_id = participants_info._id;""", connect) 
df.to_html(open('messages.html', 'w')) 
base_filename = 'test.txt' 
with open(os.path.join(base_filename),'w') as outfile: 
    df.to_string(outfile) 
print (df) 

私は私がconversation_id列に基づいて、より小さなものにテーブルを分割できるようにしたいと思い、私は下記の午前結果のスクリーンショットを示しています。だから私は各IDごとに異なるテーブルを持っています。

Evidence

答えて

0

別名conversation_idsのカーソルリストを@CLでループすることを検討してください。改行で区切られた.htmlファイルと.txtファイルが反復的にダンプされます。ベストプラクティスのためにSQLでパラメータ化されたクエリとテーブルエイリアスを使用することもできます。

import sqlite3 
import pandas as pd 

conn = sqlite3.connect('/path/to/sqlite/database.db') 

cur = conn.cursor() 
cur = cur.execute("SELECT DISTINCT m.conversation_id" + \ 
        " FROM messages m " + \ 
        " INNER JOIN participants_info p" + \ 
        "   ON m.participant_id = p._id" + \ 
        " WHERE m.conversation_id IS NOT NULL") 

query = "SELECT m._id, m.date, m.body, m.conversation_id," + \ 
      "  p.number, p.display_name, p._id" + \ 
      " FROM messages m" + \    
      " INNER JOIN participants_info p" + \ 
      "   ON m.participant_id = p._id" + \ 
      " WHERE m.conversation_id = ?" 

with open('messages.html', 'w') as h, open('test.txt', 'w') as t: 
    for convo in cur.fetchall():    
     df = pd.read_sql_query(query, conn, params=convo) 

     # HTML WRITE   
     h.write(df.to_html()) 
     h.write('<br/>') 

     # TXT WRITE 
     t.write(df.to_string())   
     t.write('\n\n') 

cur.close() 
conn.close() 
0

conversation_idでソートするには、データベースに知らせます。その後、行ごとにデータを処理し、値が変更されるたびに新しいテーブルを開始します(つまり、最後のテーブルとは異なる場合)。

行ごとにデータを処理できない場合は、テーブルごとに1つのクエリが必要です。これには、最初にすべての会話IDのリスト(SELECT DISTINCT conversation_id FROM whatever)を取得し、各値(SELECT ... WHERE conversation_id = ?)の実際のクエリを実行する必要があります。

関連する問題