2017-02-12 69 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的光標列表,將數據幀迭代地轉儲到正在增長的.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進行排序。然後逐行處理數據,並在值發生更改時啓動一個新表,即與最後一個表不同。

如果你不能逐行處理數據,那麼你需要每個表的一個查詢。這要求您首先獲得所有對話ID的列表(SELECT DISTINCT conversation_id FROM whatever),然後對每個值執行實際查詢(SELECT ... WHERE conversation_id = ?)。