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,
}