2017-02-12 71 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 = ?)。