2012-04-01 51 views
5

我是一個初學者在Python和使用SQLite。所以請耐心等待我。我不完全確定我應該提供多少信息,所以我決定放置儘可能多的代碼,因爲我認爲這是相關的。正如俗話所說;比對不起更安全。如何將數據從SQLite數據庫中讀出到字典中,然後再用JSON進行編碼?

基本上,我有一個python腳本運行cherrypy服務器的一種點對點社交網絡的web應用程序。我有一種方法記錄了我對配置文件進行的三種更新;新帖子,新照片或新活動。

每個更新包含以下字段:

messageID: A 16 letter string containing a unique identifier 
creator: My user name 
created: A time stamp, UNIX Epoch time, of when the update took place 
body: A short message about the update. 
Link: A link to the update. e.g.. "/gallery/photo5" 
Type: type 1 means new post, 2 means photo, 3 means event. 

我做了這些領域與SQLite的創建的數據庫中的表列,這是我用來做什麼的方法:

@cherrypy.expose 
    def writeUpdate(self, type=None): 
     """This method is called whenever a change takes place on the Acebook 
     It takes an input 'type' to know what kind of update it is. 
     The method then make appropriet change to the 'Updates' database 
     """ 

     con = lite.connect('static/database/Updates.db') 
     messageID = self.randomword() 
     creator = trueUser 
     created = time.time() 
     if type == 1: 
      link = "/homepage" 
      body = "New Status Update" 
     elif type == 2: 
      link = "/portfolio" 
      body = "New Photo Update" 
     elif type ==3: 
      link = "/event" 
      body = "New Event Update" 
     else: 
      link = "/homepage" 
      body = "If you are seeing this, something is not quite right with by server" 

     with con: 

      cur = con.cursor() 
      cur.execute("CREATE TABLE IF NOT EXISTS Updates(messageID TEXT, creator TEXT, created INT, link TEXT, type INT, body TEXT)") 
      cur.execute("INSERT INTO Updates VALUES(?, ?, ?, ?, ?, ?)", (messageID, creator, created, link, type, body)) 

      "Debugging check" 
      cur.execute('select * from Updates') 
      print "The Updates database now contains:" 
      for row in cur: 
       print row 


     return   

我有另一種方法,我的朋友可以打電話來獲取我最新更新的新聞。這種方法是:

@cherrypy 
def getActivity(self, minutes=48*60): 
「」」 Return any updates since last time this user requested them. Optional argument returns the last updates in the given time period instead. 
「」」 
# current_user = getAuthenticatedUser(): # if not current_user: 
# return 「Please Authenticate」 
# updates = getUpdatesByUser(current_user) 

ExampleUpdate = [ { 
‘messageID’: 「ccog001-1332889924-839」, ‘creator’: 「ccog001」, 
‘created’: 1332889924, 
‘link’: 「/updates?id=839」, 
‘type’: 1, 
‘body’: 「Hello, is anybody out there?」 
},{ 
‘messageID’: 「ccog001-1332890482-840」, ‘creator’: 「ccog001」, 
‘created’: 1332890482, 
‘link’: 「/updates?id=840」, ‘type’: 1, 
‘body’: 「Seriously, is this thing on?」 } 
] 


reply = json.dumps(updates) 
return reply 

我的問題是,我如何讀取數據庫中的各個行到一個單獨的字典,然後將所有的字典一起放入變量示例更新的格式,編碼這一切之前json.dumps?

或者,如果我在將字典寫入數據庫之前先將messageID,創建者,創建的...等寫入字典,那麼它會更容易些嗎?所以我最終只有一個包含一列字典的數據庫?如果是這樣,代碼會是什麼樣的?

我很新,所以請在您的回答中詳細說明,最好是帶有代碼和評論以幫助我理解。

非常感謝您對您的時間

+1

此任務的哪一部分對您有問題?它看起來像你知道如何從數據庫中讀取,以及如何使用'json'編碼器。 – Marcin 2012-04-01 10:59:29

+0

@Marcin我想現在有問題的位是從單個數據庫行讀取數據到單獨的字典中。然後將所有字典放入變量「ExampleUpdate」的格式中,然後用「json.dumps」編碼。 – Synia 2012-04-01 19:49:35

+0

好吧,繼續並更新您的問題以清楚地說明問題。 – Marcin 2012-04-02 06:57:57

回答

4

的列名保存在Cursor.description執行SELECT語句之後。根據docs,此列表中的每個條目都是一個7元組,其中第一個元素由該列的名稱填充。

您可以提取列名和形成dict如下:

cur.execute('select * from Updates') 

# extract column names 
column_names = [d[0] for d in cur.description] 

for row in cur: 
    # build dict 
    info = dict(zip(column_names, row)) 

    # dump it to a json string 
    reply = json.dumps(info) 

這裏,zip需要兩個列表column_namesrow和逐元素縫合在一起成元組的列表。然後dict將它變成一個字典,準備好轉儲json

相關問題