flask笔记6:数据库Flask-sqlalchemy

Table of Contents

01 使用sqlalchemy配置

02 创建模型类

03 db对象创建表

04 保存数据

05 查询

06 关联查询

07 数据修改删除


01 使用sqlalchemy配置

原始方式:connect、cursor等

Sqlalchemy操作模型类

模型类->sql sql->模型类

Python3一般依赖pymysql,Python2依赖mysql-python(数据库驱动)

数据库驱动:

host=127.0.0.1

port=3306

connect()

cursor.execute(sql)

Sqlalchemy

pip install flask-sqlalchemy

新建db_demo.py

from flask_sqlalchemy import SQLAlchemy

class Config(object):

       SQLALCHEMY_DATABASE_URL="mysql://root:[email protected]:3306/database_9"

       SQLALCHEMY_TRACK_MODIFICATIONS=True

 

app.config.from_object(Config)

创建工具对象

db=SQLAlchemy(app)

02 创建模型类

创建模型类,继承db.Model,表名常用前缀数据库名或tbl,类名不必与表名完全一致

创建Column时可以设置字段类型、列选项,设置主键后默认自增

class User(db.Model):

       __tablename__="users"

       id=db.Column(db.Integer,primary_key=True)

       name=db.Column(db.String(64),unique=True)

       email=db.Column(db.String(128),unique=True)

       password=db.Column(db.String(128))

class Role(db.Model):

       __tablename__="roles"

       id=db.Column(db.Integer,primary_key=True)

       name=db.Column(db.String(64),unique=True)

两表之间关系

class User(db.Model):

       __tablename__="users"

       id=db.Column(db.Integer,primary_key=True)

       name=db.Column(db.String(64),unique=True)

       email=db.Column(db.String(128),unique=True)

       password=db.Column(db.String(128))

       role_id=db.Column(db.Integer,db.ForeignKey("roles.id"))

class Role(db.Model):

       __tablename__="roles"

       id=db.Column(db.Integer,primary_key=True)

       name=db.Column(db.String(64),unique=True)

       users = db.relationship("User",backref="role")

Relationship两个类关联。只有关联,没有在数据库表中实际存储

Backref使User可以直接使用role,如果不添加就手动通过role_id查询

03 db对象创建表

操作db对象,清除数据库中原有表

if __name__ == '__main__':

       db.drop_all()

创建所有表:

db.create_all()

04 保存数据

通过db对象session任务保存

if __name__ == '__main__':

       db.drop_all()

       db.create_all()

       role1=Role(name="admin")

       db.session.add(role1)

       db.session.commit()

一次添加多条

       user1=User(name='wang',email='[email protected]',password='123456',role_id=role1.id)

       user2=User(name='dui',email='[email protected]',password='123456',role_id=role1.id)

       db.session.add_all([user1,user2])

       db.session.commit()

05 查询

查询多条

li=Role.query.all()#取出所有对象

li[0].name#取值

查询一条:

r=Role.query.first()

r.name

主键查询:

r=Role.query.get(2)

r.name

使用db.session效果同

db.session.query(Role).all()

db.session.query(Role).get(2)

db.session.query(Role).first()

使用过滤器:

常见的有filter_by、filter、offset 、limit、order_by、group_by等

filter_by:

User.query.filter_by(name="wang").all()

User.query.filter_by(name="wang").first()

接收查出的对象后也都按照对象取值的方法

多条件:

User.query.filter_by(name="wang",role_id=1).first()

filter:查询条件格式不同,注意用==,写上表名

User.query.filter(User.name=="wang",User.role_id==1).first()

Or(或)条件查询:

from sqlalchemy import or_

User.query.filter(or_(User.name=="wang",User.role_id==2)).first()

Offset代表跳过几条开始取,limit设置取出几条

li=User.query.offset(1).limit(2).order_by(User.id.desc()).all()

分组之后返回的就不是对象,而是个别字段了

from sqlalchemy import func

li=db.session.query(User.role_id,func.count(User.role_id) ).group_by(User.role_id).all()

06 关联查询

Role对象中关联了user

ro=Role.query.get(1)

name=ro.users[0].name

从user查询role对象

user=User.query.get(1)

Role.query.get(user.role_id)

在backref后等同于:

user=User.query.get(1)

user.role

每次拿到对象直接打印都是对象编号,不直观,重写__repr__方法

class User(db.Model):

       __tablename__="users"

       id=db.Column(db.Integer,primary_key=True)

       name=db.Column(db.String(64),unique=True)

       email=db.Column(db.String(128),unique=True)

       password=db.Column(db.String(128))

       role_id=db.Column(db.Integer,db.ForeignKey("roles.id"))

 

       def __repr__(self):

              return "User object: name=%s" % self.name

class Role(db.Model):

       __tablename__="roles"

       id=db.Column(db.Integer,primary_key=True)

       name=db.Column(db.String(64),unique=True)

       users = db.relationship("User",backref="role")

 

       def __repr__(self):

              return "Role object: name=%s" % self.name

07 数据修改删除

修改:

user=User.query.get(1)

user.name="python"

db.session.add(user)

db.session.commit()

User.query.filter_by(name="zhou").update({"name":"python","email":"[email protected]"})

db.session.commit()

删除:

user=User.query.get(1)

db.session.delete(user)

db.session.commit()

直接在数据库使用sql语句进行update和delete时要先用查询测试where条件对不对,防止删错了

猜你喜欢

转载自blog.csdn.net/lagoon_lala/article/details/107137229
今日推荐