flask-sqlchemy使用

在项目中使用到了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_keytablename都是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只使用过简单的 单对单的关系,复杂的关系操作,后写再写。

发布了190 篇原创文章 · 获赞 19 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/zengchenacmer/article/details/45032033