Pony ORM - Устранить ошибку «Ожидаемая строка или байтовый объект»

В настоящее время я разрабатываю API для AWS с Chalice на Python, который использует Pony ORM для обработки нашей базы данных. При попытке выполнить запрос с помощью такого выбора db.select(s.start_time for s in db.Session) я получаю сообщение об ошибке «Ожидаемая строка или байтовый объект» (полная трассировка стека ниже). Однако запрос с использованием такой лямбда-выражения db.Session.select(lambda s: s.id = 3) работает, как и ожидалось. потеря того, что могло быть причиной этого, можно предположить, что часть db.Provider не нравится при генерации, но я не уверен, что там ожидает Pony.Я пробовал отлаживать с помощью pdb, но я не уверен что это говорит мне.

Трассировки стека:

Traceback (most recent call last): File "c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\chalice\app.py", line 842, in _get_view_function_response response = view_function(**function_args) File "C:\Users\Gamer\Documents\AWS-SakMed\backend\SakMed\app.py", line 51, in _view_function return wrapped(*args, **kwargs) File "", line 2, in get_cases File "c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py", line 528, in new_func result = func(*args, **kwargs) File "C:\Users\Gamer\Documents\AWS-SakMed\backend\SakMed\app.py", line 89, in get_cases query = db.select(p.first_name for p in db.Provider) File "c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py", line 881, in select if not select_re.match(sql): sql = 'select ' + sql TypeError: expected string or bytes-like object

Прохождение отладки pdb (форматирование немного странное):

c:\users\gamer\documents\aws-sakmed\backend\sakmed\app.py(89)get_cases()

-> query = db.select(p.first_name for p in db.Provider) (Pdb) step(s)
--Call-- c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(3927)iter()

-> def iter(entity): (Pdb) c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(3928)iter()

-> return EntityIter(entity) (Pdb)
--Call-- c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(3630)init()

-> def init(self, entity): (Pdb) c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(3631)init()

-> self.entity = entity (Pdb)
--Return-- c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(3631)init()->None

-> self.entity = entity (Pdb)
--Return-- c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(3928)iter()->
-> return EntityIter(entity) (Pdb)
--Call-- c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(879)select()

-> @cut_traceback (Pdb) c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(881)select()

-> if not select_re.match(sql): sql = 'select ' + sql (Pdb) pp(sql) generator object get_cases.locals.genexpr at 0x048062B0 (Pdb)
step(s) TypeError: expected string or bytes-like object c:\users\gamer.virtualenvs\backend-qptpobgm\lib\site-packages\pony\orm\core.py(881)select() -> if not select_re.match(sql): sql = 'select ' + sql (Pdb)

Соответствующий код: app.py

db = create_database()
datastore = DataStore(db)

def app_db_session(func):
    wrapped = db_session(func)
    def _view_function(*args, **kwargs):
        global db_is_bound
        if not db_is_bound:
            debug = os.getenv('localdev')
            if debug is None:
                datastore.connect(host, name, password, dbname)
            elif debug == 'True':
                datastore.connect('localhost', 'user', 'password', 'local-db')
            db_is_bound = True
        return wrapped(*args, **kwargs)
    return _view_function

@app.route('/recipient/{rec_id}/cases', methods=['GET'])
@app_db_session
def get_cases(rec_id):

    query = db.Provider.select(lambda p: p.id == 1)
    query = db.select(p.first_name for p in db.Provider))

Соответствующий код: data_store.py

class DataStore():
    def __init__(self, db):
        self.db = db
    def connect(self, host, user, passwd, db_name):
        self.db.bind(provider='mysql', host=host, user=user, passwd=passwd, db=db_name)
        self.__map_data_models()
    def bind_memory(self):
        self.db.bind(provider='sqlite', filename=':memory:')
        self.__map_data_models()
    def __map_data_models(self):
        self.db.generate_mapping(create_tables=True)

Соответствующий код: base.py

def create_database():

    db = Database()

    class Provider(db.Entity):
        id = PrimaryKey(int, auto=True)
        hsa_id = Required(str)
        role = Optional(str)
        available = Required(bool)
        first_name = Optional(str)
        last_name = Optional(str)
    return db
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
524
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите использовать синтаксис генератора, вам нужно использовать функцию select:

from pony import orm
...
query = orm.select(p for p in Person if p.name.startswith('A'))
for obj in query:
    print(obj.name)

Метод select объекта Database используется для необработанных SQL-запросов.

from pony import orm
...
db = orm.Database('sqlite', ':memory:')
...
rows = db.select("id, name FROM person p WHERE p.name LIKE 'A%'")
for row in rows:
    print(row[1])

Другие вопросы по теме