Pony ORM解析“预期的字符串或字节类对象”

2024-03-29 01:59:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在用Python中的Chalice为AWS开发一个API,它使用Pony ORM来处理我们的数据库。当尝试使用这样的select进行查询时,db.select(s.start_time for s in db.Session)我得到了'Expected string or bytes like object'错误(下面是完整的堆栈跟踪)。但是,使用这样的lambda查询db.Session.select(lambda s: s.id = 3)可以正常工作。我不知道是什么原因造成的,我猜是数据库提供程序生成时不喜欢part,但我不确定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)

相关代码:应用程序副本在

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))

相关代码:数据_存储.py在

^{pr2}$

相关代码:基准.py在

^{3}$

Tags: pycorebackenddblibpackagesormsite
1条回答
网友
1楼 · 发布于 2024-03-29 01:59:35

如果要使用生成器语法,则需要使用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)

Database对象的方法select用于原始SQL查询

^{pr2}$

相关问题 更多 >