2012-04-01 37 views
5

Tôi là người mới bắt đầu ở python và sử dụng SQLite. Vì vậy, hãy kiên nhẫn với tôi. Tôi không hoàn toàn chắc chắn bao nhiêu thông tin tôi nên cung cấp, vì vậy tôi đã quyết định đưa lên nhiều mã như tôi nghĩ là có liên quan. Giống như câu nói đi; Cẩn tắc vô ưu.Làm thế nào để đọc dữ liệu từ một cơ sở dữ liệu SQLite, vào một từ điển trước khi mã hóa nó trong JSON?

Về cơ bản, những gì tôi có là một tập lệnh python chạy một máy chủ cherrypy cho một loại ngang hàng để ngang hàng ứng dụng web mạng xã hội. Tôi có một phương thức ghi lại ba loại cập nhật mà tôi thực hiện cho tiểu sử của mình; Bài đăng mới, ảnh mới hoặc sự kiện mới.

Mỗi Cập nhật chứa các lĩnh vực sau:

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. 

tôi đã thực hiện các lĩnh vực này thành các cột của một bảng bên trong một cơ sở dữ liệu được tạo ra với SQLite, đây là phương pháp tôi sử dụng để làm điều đó:

@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   

Tôi có một phương pháp khác mà bạn bè của tôi có thể gọi để nhận nguồn cấp tin tức về các cập nhật mới nhất của tôi. Phương pháp này là:

@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 

Câu hỏi của tôi là, làm thế nào để tôi đọc hàng cá nhân của các cơ sở dữ liệu vào một cuốn từ điển riêng biệt, và sau đó kết hợp tất cả các từ điển lại với nhau thành các định dạng của biến các Ví dụ Update, trước khi mã hóa tất cả với json.dumps? Hoặc có lẽ sẽ dễ dàng hơn nếu tôi viết thông điệpID, người sáng tạo, tạo ... ... vào một từ điển trước, trước khi viết từ điển đó vào cơ sở dữ liệu? Không. Vì vậy, tôi kết thúc với một cơ sở dữ liệu chỉ chứa một cột từ điển? Nếu vậy, mã sẽ như thế nào?

Tôi khá mới, vì vậy hãy nêu chi tiết câu trả lời của bạn, tốt nhất là với mã và nhận xét để giúp tôi hiểu.

Cảm ơn bạn rất nhiều cho bạn thời gian tên

+1

Phần nào của tác vụ này có vấn đề với bạn? Có vẻ như bạn biết cách đọc từ cơ sở dữ liệu và cách sử dụng bộ mã hóa 'json'. – Marcin

+0

@Marcin Vấn đề bit tôi đoán bây giờ là đọc dữ liệu từ hàng riêng lẻ của cơ sở dữ liệu vào một từ điển riêng biệt. Và sau đó đặt tất cả các từ điển vào định dạng biến "ExampleUpdate", trước khi mã hóa bằng "json.dumps". – Synia

+0

OK, hãy tiếp tục và cập nhật câu hỏi của bạn để làm rõ điều đó. – Marcin

Trả lời

4

Cột được lưu trữ trong Cursor.description sau khi thực hiện một tuyên bố SELECT. Theo số docs, mỗi mục nhập trong danh sách này là 7-tuple trong đó phần tử đầu tiên được điền bằng tên của cột.

Bạn có thể trích xuất các tên cột và tạo thành một dict như sau:

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) 

Ở đây, zip mất hai danh sách column_namesrow và khâu chúng lại với nhau thành phần khôn ngoan vào một danh sách các hàng. dict sau đó biến điều này thành một từ điển sẵn sàng cho json để đổ.

Các vấn đề liên quan