Table of Contents
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:mysql@127.0.0.1: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='wang@163.com',password='123456',role_id=role1.id) user2=User(name='dui',email='dui@163.com',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":"python@itcast.cn"}) db.session.commit() |
删除:
user=User.query.get(1) db.session.delete(user) db.session.commit() |
直接在数据库使用sql语句进行update和delete时要先用查询测试where条件对不对,防止删错了