Как прочитать данные из базы данных SQLite в словарь, прежде чем кодировать их в JSON? - PullRequest
5 голосов
/ 01 апреля 2012

Я новичок в Python и использую SQLite. Поэтому, пожалуйста, будьте терпеливы со мной. Я не совсем уверен, сколько информации я должен предоставить, поэтому я решил разместить столько кода, сколько я думаю, имеет отношение. Как говорится в поговорке; береженого Бог бережет.

По сути, у меня есть скрипт на python, выполняющий сервер cherrypy для своего рода однорангового веб-приложения для социальных сетей. У меня есть метод, который регистрирует три вида обновлений, которые я делаю в своем профиле; Новая запись, новая фотография или новое событие.

Каждое обновление содержит следующие поля:

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

У меня вопрос, как мне прочитать отдельные строки базы данных в отдельный словарь, а затем объединить все словарь вместе в формат переменной Example Update, прежде чем кодировать все это с помощью json.dumps?

Или было бы проще, если бы я сначала записал в словарь messageID, создатель, созданный ... и т. Д. ... перед записью этого словаря в базу данных? Таким образом, я получаю базу данных, содержащую только один столбец словарей? Если да, то какой будет код?

Я новичок, поэтому, пожалуйста, будьте подробно в своем ответе, желательно с кодом и комментариями, которые помогут мне понять.

Большое спасибо за потраченное время

1 Ответ

4 голосов
/ 03 апреля 2012

Имена столбцов сохраняются в Cursor.description после выполнения оператора SELECT.Согласно документам каждая запись в этом списке представляет собой 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_names и row и поэлементно объединяет их в список кортежей.dict затем превращает это в словарь, готовый для json для выгрузки.

...