在项目中使用到了flask-sqlalchemy,在这总结一下用法,防止以后忘记了,又得去查英文资料。
1、sqlalchemy 使用第一阶段:
首先把表结构通过类的方式告诉sqlalchemy,如下:
class AlarmStatistical(db.Model):
__bind_key__ = 'xnet_master'
__tablename__ = 'dashboard_alarm_statistical'
id = db.Column(db.Integer, primary_key=True)
source = db.Column(db.String(255), index=True)
pod = db.Column(db.String(255), index=True)
start_time = db.Column(db.DateTime, index=True)
count = db.Column(db.Integer)
def __init__(self, source, pod, start_time, count):
self.source = source
self.pod = pod
self.start_time = start_time
self.count = count
def alter(self):
self.count += 1
bind_key、tablename都是flask中的环境变量,表示数据库路径和表名
注意点:必须得有primary_key
并且你可以在这个类中写一些函数,使用时,可以直接用数据库中的数据来调用这些函数
这样我们就把表建好了,下面来看一些操作
2、select操作
使用sqlalchemy进行select的基本方法是 filter和filter_by
区别是,filter_by中可以使用一些复杂的表达式
f = AlarmStatistical.query.filter(AlarmStatistical.id == id).all()
.all()表示返回所有的符合条件的数据,还有其他方法
.first()返回第一条数据
.limit(n)返回 n条数据
还有加一下排序等方法,具体查找官网api
还可以这样使用:
data = AlarmStatistical.query.filter(AlarmStatistical.id == id)
data = data.filter(AlarmStatistical.pod == pod).all()
#可以模糊查询、或者其他条件查询
#模糊查询:
query.filter(User.email.endswith('@example.com')).all()
如果你有多条不确定的条件,可以这样使用
p0=[AlarmStatistical.id==id,]
p1=[AlarmStatistical.pod == pod]
data = AlarmStatistical.query.filter(and_(p0),and_(p1))
#或者这样
p = [AlarmStatistical.id==id, AlarmStatistical.pod == pod]
data = AlarmStatistical.query.filter(and_(p))
3、插入数据
p = AlarmStatistical(......) #调用class中的__init__()函数
db.session.add(p)
db.session.commit()
4、使用原生的sql语句
很多复杂查询,用sqlalchemy对象不方便实现时,就可以直接使用sql的原生语句,但得注意一些sql的攻击,如 sql注入攻击
db.engine.execute(sql)
5、delete 数据
p = AlarmStatistical()
db.session.delete(p)
db.session.commit()
6、update数据
更新数据,得先查询到盖数据,再进行更新
u=AlarmStatistical.query.first()
u.id=123
#更新数据和变量赋值那么简单,但必须是通过查询返回的对象。
db.session.commit()
这个时候,就能使用class中的方法,如:
u=AlarmStatistical.query.first()
u.alter()
db.session.commit()
7、使用sql中的函数
#这个查询,会比较复杂,在现实使用中,完全可以使用原生的sql语句
data = (db.session.query(db.func.date_format(AlarmMessage.alarm_time, '%Y-%m-%d %H:%i').label('alarm_time'), AlarmMessage.alarm_source, AlarmMessage.pod,db.func.count('*').label('alarm_sum')).filter(AlarmMessage.alarm_time >= start_time, AlarmMessage.alarm_time <= end_time)
.group_by(AlarmMessage.alarm_source, AlarmMessage.pod) )
使用sql中的函数:db.func.function-name( ).label(‘name’) , label是指查询后,访问时的名字,使用label之后,可以这样访问 data.name
query() 这里表示select 的数据
filter 表示select 的条件
对于sqlalchemy只使用过简单的 单对单的关系,复杂的关系操作,后写再写。