Flask ORM db操作

Flask DB

1,db模块的引入

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

2, 模型的定义

一般在项目的models目录下的py文件中定义数据模型,形式是定义类,继承db.Model

class AdTestResponse(db.Model):

类中,以类变量形式定义,数据模型字段

class XXXX(db.Model):
    __tablename__ = "XXXX"
    __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    id = db.Column(db.Integer, primary_key=True, nullable=False, autoincrement=True)
    show_id = db.Column(db.VARCHAR(30), default=None)
    request_id = db.Column(db.VARCHAR(30), default=None)

注意:
db.Column定义字段,Column大写
字段类型,db.Integer,db.VARCHAR,db.Text,db.DateTime。。。。。
另外还可以定义primary_key,定义 default值

3,CRUD操作

3.1 可以再视图中操作
往数据库加记录,前提是ATest model类已经定义好

    ad_resp = ATest(show_id=show_id, request_id=request_id, response_header=res_headers,response_content=res_content)
    db.session.add(ad_resp)
    db.session.commit()

3.2 在model类中定义查询等操作
例如,在定义的AdTest中,定义一个查询函数,我将这个函数的属性定义未classmethod

     @classmethod
    def get_all_detail(cls,template_id):
        return db.session.query(cls.field_id, cls.is_first, cls.head_field,
                                cls.is_multi, cls.min_quantity,
                                cls.max_quantity,
                                Fields.field_name).join(Fields, Fields.id == cls.field_id). \
            filter(cls.templates_id == template_id).all()

query后面接的是要查询的字段,可以是当前cls的字段,也可以是链接的表的字段,链接的表的字段需要带上表名字
join定义链接的表,第一个是链接的表名,第二个是链接的表达式
filter是过滤条件
all是表示查询所有,也可以是first()表示第一条记录

all()方法的查询语句返回值是一个列表
first()方法的查询语句返回值是模型类AdTest的实例对象

all之前也可以带上limit,限制查询的条数

        res = db.session.query(AdTest.request_id).filter(AdTest.create_time>=date_time,AdTest.show_id==showid).limit(5).all()

filter()跟filter_by()的区别
db.session.query(类名).filter(类名.属性名==‘xxx’)

db.session.query(类名).filter_by(属性名=‘xxx’)
filter需要通过类名.属性名的方式,类名.属性名==值。filter_by 直接使用属性名=值
filter支持> <等关系运算符支持and_、or_、in_、no’t等语法。filter_by不支持
参考:https://my.oschina.net/u/2343604/blog/3105787

query.filter(User.name.in_(['ed', 'wendy', 'jack']))
# works with query objects too:
query.filter(User.name.in_(
        session.query(User.name).filter(User.name.like('%ed%'))
))
query.filter(~User.name.in_(['ed', 'wendy', 'jack']))
from sqlalchemy import or_
query.filter(or_(User.name == 'ed', User.name == 'wendy'))
from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))

注意:filter 用not_,or_,and_ 要导入!
from sqlalchemy import not_,or_,and_

filter实现组合查询

db.session.query(类名).filter(条件1).filter(条件2)
db.session.query(类名).filter(条件1,条件2)
query.filter(and_(条件1, 条件2))

3.3 Model类query

查询一个对象
user = User.query.first()
查询一个对象集合
endwithg = User.query.filter(User.name.endswith(“g”)).all()

对查询的单个对象,可以进行修改和删除
修改:

user = User.query.first()
user.name = 'dong'
db.session.commit()

修改也可以:

  user= User.query.filter_by(id=id).update({
            "name": name})
 db.session.commit()

删除:

user = User.query.first()
db.session.delete(user)
db.session.commit()

删除还可以:

User.query.first().delete()
db.session.commit()

Model类的查询方法,要想实现查询部分字段,可以:
在model类中,写serialize方法,此方法,一可以返回需要的python结构,便于前端处理,一是可以限定返回的字段

class Case(db.Model):
    __tablename__="Case"
    __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    id=db.Column(db.INTEGER,primary_key=True,nullable=False,autoincrement=True)
    name=db.Column(db.VARCHAR(50),default=None)
    key=db.Column(db.VARCHAR(50),default=None)
    desc=db.Column(db.VARCHAR(50),default=None)
    expect=db.Column(db.VARCHAR(50),default=None)
    create_date=db.Column(db.DATETIME)
    update_date=db.Column(db.DATETIME)

    @property
    def serialize(self):
        return {"id": self.id,
                "name": self.name,
                "desc": self.desc,
                "expect": self.expect,
                "create_date": self.create_date,
                "update_date": self.update_date,
                }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值