在“ Flask Mega-Tutorial”之后,我正在开发我的第一个适当的Web应用程序。它帮助我开始使用SQLAlchemy ORM,并使我对如何使用此工具有所了解。
例如,我有一个Pet类。我可以打电话
foo = Pet.query.filter_where(id=1).first()
这将导致Pet类的foo。 Pet的定义具有许多属性,但是每个属性的类型均为“ db.Column”,这是有意义的,因为每个Pet都是Pets表中的一条记录。
我现在很困惑的是,我想对Pet表执行更复杂的SQL,但仍然可以将这些记录作为Pet对象访问。
pets = db.session.execute('SELECT * FROM pet WHERE blahblah = blahblah').fetch_all()
现在我有了这个pet列表,查询返回的每个Pet记录的所有属性。
现在如何为这些记录中的每一个实例化Pet类的对象?当我用ORM查询时,我得到了对象。 app / models.py中定义的我的Pet类没有接受任何参数的 init 。
现在,我正在获取结果列表,从结果中获取“ id”值,然后在for循环中将它们全部创建为对象
pets = db.session.execute('SELECT * FROM pet WHERE blahblah = blahblah').fetch_all()
pet_objects=[]
for p in pets:
record_id = p.id
pet_object = Pet.query.filter_where(id=record_id)
pet_objects.append(pet_object)
从那时起,我可以将我的Pet对象列表与使用ORM的查询结果一样对待,该ORM将自动返回对象。
我的问题是,我这样做正确吗?似乎不正确,因为对于每条记录,我首先使用SQL命中数据库,然后再次通过其“ id”实例化该对象,但是我不确定该框架中的record-> Object还有什么其他方法。
很抱歉,这个问题很久了,但是我一直在努力解决这个问题。
答案 0 :(得分:1)
如果我错了,请纠正我,您想使用SELECT * FROM pet WHERE blahblah = blahblah
获得此查询sqlalchemy
的结果。
您可以在filter_by
类中使用base query
方法:
例如对于您的查询,您可以使用此:
pet_objects = Pet.query.filter_by(blahblah='blahblah').all()
您可以使用联接来创建甚至更复杂的查询,也可以通过向filter_by
添加更多参数来简单地添加更多约束条件,例如:
query.filter_by(col_1= 'something', col_2 = 'another thing')