时间:2021-07-01 10:21:17 帮助过:21人阅读
在flask中使用ORM sqlchemy
1.新建modles.py. 如果已有数据表,https://www.devmashup.com/generating-flask-sqlalchemy-models-with-flask-sqlacodegen/ 用flask-sqlacodegen来转成models.py
2.models.py中的模型类可以指定排序方式 __mapper_args__ = {"order_by": createtime.asc()}
也可以在查询条件中使用 order_by方法
.order_by(Order.updatetime.desc())
3.可以指定外键, 关联信息, 这样查一个表的时候,会把关联信息也返回 查用户的时候orders字段返回订单信息, 查订单表的时候,company字段返回用户信息,两个表一对多,多的用外键
https://blog.csdn.net/cswenrou/article/details/105256519
order表
companyid = db.Column(db.Integer, ForeignKey("company.id"), info=‘公司ID‘)
company = relationship("Company", back_populates="orders")
company表
orders = relationship("Order", back_populates="company")
4.sqlachemy的数据查询使用modle模型orm,返回结果是模型对象,需要解析,使用flask_marshmallow;
新建schema.py,可以选择要返回的字段,返回字段的类型,嵌套数据
class OrderSchema(ma.SQLAlchemySchema): class Meta: model = Order fields = ( "id", "orderno", "title", "paytime", "assignordertime", "price", "company") price = fields.Str() company = fields.Nested(CompanySchema, attribute="company")
5.或者不使用relationship,直接在代码中进行关联查询
https://www.cnblogs.com/shenckicc/p/6797990.html
outerjoin方法是左连接
filter方法是查询条件,要用模型.字段, 要使用 == >=等 filter_by 直接使用 字段=条件
with_entities查询指定的字段,返回的都是一个列表,列表内的元素是一个元组,不过不是 Python 内置的元组,是 sqlalchemy.util._collections.KeyedTuple。
使用这个方法返回的数据转成python的dict dict(zip(i.keys(), i))
paginate方法,分页查询
all方法查询全部
first方法查询一条
pagination = Order.query.outerjoin(OrderLawyer, OrderLawyer.orderid == Order.id).filter( Order.state == current_app.config[‘ORDER_STATE_CONFIRM‘] ).with_entities(Order.id, Order.orderno, Order.title, Order.paytime, Order.price, Order.costprice).order_by( Order.updatetime.desc()).paginate( page, per_page=current_app.config[‘PER_PAGE‘], error_out=False ) rows = pagination.items for i in rows: i = dict(zip(i.keys(), i))
6. 添加一条数据后,马上要使用返回的id, 使用flush()马上入库
db.session.add(row)
db.session.flush()
ret = Pm() #实例化模型对象
ret.objectid = row.id #flush 之后可以使用row.id
db.session.add(ret) #添加记录
db.session.commit() #提交事务
db.session.close()
------------恢复内容结束------------
sqlachemy使用总结
标签:实例 comm details 对象 nested 入库 page shu 添加