2012-04-01 6 views
5

Soy un principiante en python y uso de SQLite. Asi que por favor se paciente conmigo. No estoy del todo seguro de cuánta información debo proporcionar, por lo que he decidido poner tanto código como creo que está relacionado. Como dice el refrán; más vale prevenir que curar.Cómo leer datos de una base de datos SQLite, en un diccionario antes de codificarlo en JSON?

Básicamente, lo que tengo es una secuencia de comandos python que ejecuta un servidor cerebrito para una especie de aplicación web de redes sociales entre pares. Tengo un método que registra tres tipos de actualizaciones que realizo en mi perfil; Publicación nueva, nueva foto o nuevo evento.

Cada actualización contiene los siguientes campos:

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. 

que he hecho estos campos en columnas de una tabla dentro de una base de datos creada con SQLite, aquí es el método que utiliza para hacerlo:

@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   

Tengo otro método que mis amigos pueden llamar para recibir noticias sobre mis últimas actualizaciones. Este método es:

@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 

Mi pregunta es, ¿cómo puedo leer filas individuales de la base de datos en un diccionario, y luego combinar todo el diccionario juntos en el formato de la variable Ejemplo Update, antes de codificar todo con json.dumps?

¿O sería más fácil si escribo el messageID, creador, creado ... etc ... primero en un diccionario, antes de escribir ese diccionario en una base de datos? ¿Así que termino con una base de datos que contiene solo una columna de diccionarios? Si es así, ¿cómo sería el código?

Soy bastante nuevo, así que por favor sea detallado en su respuesta, preferiblemente con código y comentarios para ayudarme a entender.

Muchas gracias por su tiempo nombres

+1

¿Qué parte de esta tarea le resulta problemática? Parece que sabes cómo leer desde la base de datos y cómo usar el codificador 'json'. – Marcin

+0

@Marcin Supongo que la cuestión problemática ahora es leer los datos de una fila individual de la base de datos en un diccionario separado. Y luego poner todos los diccionarios en el formato de la variable "ExampleUpdate", antes de codificar con "json.dumps". – Synia

+0

OK, continúe y actualice su pregunta para dejarlo en claro. – Marcin

Respuesta

4

La columna se almacenan en Cursor.description después de ejecutar una declaración SELECT. De acuerdo con el docs, cada entrada en esta lista es un 7-tuple donde el primer elemento está poblado por el nombre de la columna.

Puede extraer los nombres de columna y forman un dict de la siguiente manera:

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) 

Aquí, zip toma las dos listas column_names y row y las une elemento a elemento en una lista de tuplas. dict luego convierte esto en un diccionario listo para json para volcar.

Cuestiones relacionadas