来自纯SQL查询的实例化模型类对象?

时间:2019-03-11 22:44:30

标签: python flask sqlalchemy flask-sqlalchemy

在“ 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还有什么其他方法。

很抱歉,这个问题很久了,但是我一直在努力解决这个问题。

1 个答案:

答案 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')