• 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')])}

  • 相关阅读:
    django rest_framework中将json输出字符强制为utf-8编码
    Java
    Java
    Oracle
    IDEA
    Ubuntu
    Ubuntu
    Ubuntu
    Ubuntu
    Oracle
  • 原文地址:https://www.cnblogs.com/jackduan/p/13682275.html
Copyright © 2020-2023  润新知