sqlachemy使用总结

在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,直接在代码中进行关联查询

  • outerjoin方法是左连接
  • filter方法是查询条件,要用模型.字段, 要使用 == >=等;  filter_by方法直接使用 字段=条件
  • with_entities查询指定的字段,返回的都是一个列表,列表内的元素是一个元组,不过不是 Python 内置的元组,是 sqlalchemy.util._collections.KeyedTuple。

    使用这个方法返回的数据转成python的dict dict(zip(i.keys(), i))
  • paginate方法,分页查询
  • all方法查询全部
  • first方法查询一条

https://www.cnblogs.com/shenckicc/p/6797990.html


     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()

7.orm

字段别名 OrderLawyer.createtime.label('lawyertime')
表别名ub = aliased(UserHobby,name='ub')
data = db.session.query(ub).all()

8.request.files是二维字典, files['file']是字典
{'name': 'file', 'stream': <tempfile.SpooledTemporaryFile object at 0x00000123D4E1EFD0>, 'filename': 'btn-group-left-on@2x.png', 'headers': Headers([('Content-Disposition', 'form-data; name="file"; filename="btn-group-left-on@2x.png"'), ('Content-Type', 'image/png')])}

原文地址:https://www.cnblogs.com/jackduan/p/13682275.html