小马 ORM - 解决'Expected string or bytes-like object'错误



我目前正在为使用Python的Chalice开发API,它使用Pony Orm来处理我们的数据库。当尝试使用这样的选择查询db.select(s.start_time for s in db.Session)时,我会得到'预期字符串或字节般的对象"错误(下面的完整堆栈trace)。但是,使用这样的 db.Session.select(lambda s: s.id = 3)使用lambda进行查询。损失可能导致它的原因,一个猜测是DB。生成时不喜欢提供零件,但是我不确定小马期望的是什么。我尝试使用PDB调试,但我不确定它告诉我什么。

堆栈跟踪:

追溯(最近的最新通话): 文件" c: users gamer.virtualenvs backend-qptpobgm lib lib site-packages chalice chalice app.py",第842行,in _get_view_function_resction_response 响应= view_function(** function_args) 文件" c: users gamer documents aws-sakmed backend sakmed app.py",第51行,in _view_function 返回包装(*args,** kwargs) 文件",第2行,在get_case中 文件" c: users gamer.virtualenvs backend-qptpobgm lib lib site-packages pony pony orm orm core.py",第528行,在new_func中 结果= func(*args,** kwargs) 文件" c:c: users gamer documents aws-sakmed backend sakmed app.py",第89行,在get_cases中 查询= db.Select(p.first_name for db in db.provider) 文件" c: users gamer.virtualenvs backend-qptpobgm lib lib site-packages pony pony orm orm core.py",第881行, 如果不是select_re.match(sql):sql ='select' sql TypeError:预期字符串或类似字节的对象

通过PDB调试(格式有点怪异):

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

-> query = db.Select(p.first_name for db.provider中的p)(pdb)步骤(s)

-CALL-- C: USER GAMER.VIRTUALENVS BACKEND-QPTPOBGM lib lib site-packages pony pony orm orm core.py(3927) iter iter ()

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

->返回实体(实体)(pdb)
-Call-- C: USER gamer.virtualenvs Backend-qptpobgm lib lib site-packages pony pony orm orm core.py(3630) init init ()

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

-> self.entity =实体(pdb)
- return--c: user gamer.virtualenvs backend-qptpobgm lib lib site-packages pony pony orm orm core.py(3631) init init () ->

-> self.entity =实体(pdb)
- return - c: users gamer.virtualenvs backend-qptpobgm lib lib site-packages pony pony orm orm core.py(3928) iter iter () ->返回实体(实体)(pdb)
-CALL-- C: USER gamer.virtualenvs backend-qptpobgm lib lib site-packages pony orm orm core.py.py(879)select()select()

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

->如果不是select_re.match(sql):sql ='select' sql(pdb)pp(sql)generator object get_cases.locals.locals.genexpr at 0x048062b0(pdb)

步骤(s)TypeError:预期字符串或类似字节的对象 C: users gamer.virtualenvs backend-qptpobgm lib lib site-packages pony orm orm core.py(881)select()select() ->如果不是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)

Database对象的方法select用于RAW 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])

相关内容

最新更新