Как запросить базу данных MySQL через python, используя peewee/mysqldb?

Я создаю клиент iOS для App.net и пытаюсь настроить сервер push-уведомлений. В настоящее время мое приложение может добавить идентификатор учетной записи пользователя App.net (строка чисел) и токен устройства APNS в базу данных MySQL на моем сервере. Он также может удалить эти данные. Я адаптировал код из этих двух руководств:

Кроме того, я адаптировал этот замечательный скрипт на Python для прослушивания App. net App Stream API.

Мой Python ужасен, как и мои знания MySQL. Я пытаюсь получить доступ к токену устройства APNS для учетных записей, которые мне нужно уведомить. В моей таблице базы данных есть два поля/столбца для каждой записи, одно для user_id и одно для device_token. Я не уверен в терминологии, пожалуйста, дайте мне знать, если я могу это прояснить.

Я пытался использовать peewee для чтения из базы данных, но я в пути моя голова. Это тестовый скрипт с заполнителем user_id:

import logging
from pprint import pprint

import peewee
from peewee import *

db = peewee.MySQLDatabase("...", host="localhost", user="...", passwd="...")

class MySQLModel(peewee.Model):
    class Meta:
        database = db

class Active_Users(MySQLModel):
    user_id = peewee.CharField(primary_key=True)
    device_token = peewee.CharField()

db.connect()

# This is the placeholder user_id
userID = '1234' 

token = Active_Users.select().where(Active_Users.user_id == userID)
pprint(token)

Затем это распечатывает:

<class '__main__.User'> SELECT t1.`id`, t1.`user_id`, t1.`device_token` FROM `user` AS t1 WHERE (t1.`user_id` = %s) [u'1234']

Если код не дал ясности, я пытаюсь запросить в базе данных строку с user_id из '1234' и хочу сохранить device_token той же строки (опять же, вероятно, неправильная терминология) в переменной который я могу использовать, когда отправлю push-уведомление позже в сценарии.

Как мне правильно вернуть device_token? Кроме того, не будет ли проще отказаться от peewee и просто запросить базу данных с помощью python-mysqldb? Если это так, как я могу это сделать?


person Shawn Throop    schedule 09.12.2013    source источник


Ответы (1)


Вызов User.select().where(User.user_id == userID) возвращает объект User, но вы присваиваете его переменной с именем token, поскольку ожидаете только device_token.

Ваше задание должно быть таким:

matching_users = Active_Users.select().where(Active_Users.user_id == userID) # returns an array of matching users even if there's just one
if matching_users is not None:
    token = matching_users[0].device_token
person neilco    schedule 09.12.2013
comment
Круто, и спасибо за такой быстрый ответ. Я внес некоторые изменения, потому что оказалось, что class User(ActiveUsers)... тогда запрашивал таблицу с именем «users», хотя на самом деле моя таблица называется «active_users». Теперь с вашим кодом я правильно запрашиваю свою таблицу, но теперь я получаю этот вывод: _mysql_exceptions.OperationalError: (1054, "Unknown column 't1.id' in 'field list'") Я думаю, что это может быть как-то связано с отсутствием в моей таблице столбца с именем «id». Какие-нибудь мысли? - person Shawn Throop; 09.12.2013
comment
Unknown column означает, что столбцы существуют, так что вы правы. Добавьте в таблицу столбец id. - person neilco; 09.12.2013
comment
У меня это работает! Мне просто нужно было установить одно из полей как primary_key. Я не совсем уверен, что это значит, но он распечатывает мой токен! Я обновил строку «user_id = peewee.Charfield()» на «user_id = peewee.Charfield(primary_key=True)». Спасибо за помощь! - person Shawn Throop; 09.12.2013