我目前正在使用Python中的Chalice开发一个AWS API,它使用Pony ORM来处理我们的数据库。当尝试查询像这样的db.select(s.start_time for s in db.Session)
我得到'预期的字符串或类似字节的对象'错误(下面的完整堆栈跟踪)。但是使用像这样的db.Session.select(lambda s: s.id = 3)
lambda查询按预期工作。我在丢失到可能导致它的原因,一个猜测是生成时不喜欢db.Provider部分,但我不确定Pony在那里期待什么。我已经尝试用pdb调试,但我不确定它在告诉我什么。
堆栈跟踪:
回溯(最近一次调用最后一次):文件“c:\ users \ gamer.virtualenvs \ backend-qptpobgm \ lib \ site-packages \ chalice \ app.py”,第842行,在_get_view_function_response response = view_function(** function_args)文件“C:\ Users \ Gamer \ Documents \ AWS-SakMed \ backend \ SakMed \ app.py”,第51行,在_view_function中返回包装(* args,** kwargs)文件“”,第2行,在get_cases文件中“c :\ users \ gamer.virtualenvs \ backend-qptpobgm \ lib \ site-packages \ pony \ orm \ core.py“,第528行,在new_func结果= func(* args,** kwargs)文件”C:\ Users \ Gamer \ Documents \ AWS-SakMed \ backend \ SakMed \ app.py“,第89行,在get_cases查询= db.select(p.first_name for p in db.Provider)文件”c:\ users \ gamer.virtualenvs \ backend -qptpobgm \ lib \ site-packages \ pony \ orm \ core.py“,第881行,如果不是select_re.match(sql),则选择:sql ='select'+ sql TypeError:期望字符串或类字节对象
单步执行pdb调试(格式化有点奇怪):
C:\用户\玩家\文件\ AWS-sakmed \后端\ sakmed \ app.py(89)get_cases()
- > query = db.select(p.first_name for db 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) - 返回 - 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()
- >如果不是select_re.match(sql):sql ='select'+ sql(Pdb)pp(sql)生成器对象get_cases.locals.genexpr在0x048062B0(Pdb) step(s)TypeError:期望字符串或字节类对象c:\ users \ gamer.virtualenvs \ backend-qptpobgm \ lib \ site-packages \ pony \ orm \ core.py(881)select() - > if 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
如果要使用生成器语法,则需要使用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])