什么是ORM
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
什么是SQLAchemy
:Python编程语言下的一款ORM框架,将对象转换为SQL,然后使用数据API执行SQL并获取执行结果。以下两图可大致说明其工作方式
DB-API是Python的数据库接口规范
sqlalchemy的组成部分(可不做了解):
– engine,框架的引擎
– connection pooling 数据库连接池
– Dialect 选择链接数据库的DB-API种类(实际选择哪个模块链接数据库)
– Schema/Types 架构和类型
– SQL Expression Language SQL表达式语言
1.链接数据库,并创建模型
from sqlalchemy import create_engine
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABA#数据库配置变量
engine = create_engine(DB_URI)#创建引擎
Base = declarative_base(engine)#根据引擎创建一个基类
class Person(Base):#创建模型映射到数据库,模型的创建必须继承于Base基类
__tablename__ = 'person' #指定数据库的表名
以下加字段
Base.metadata.drop_all() #修改字段类型等不能更新需要先把原来的 drop掉
Base.metadata.create_all()#创建表格
2.数据库的增删改查
#对数据库增删该查 都是通过一个session对象
session = sessionmaker(engine)()#sessionmaker(engine) 这是一个类,后面加括号才能成为对象
def delete_data():
person = session.query(Person).first()
session.delete(person)#delete_all() 为全部
session.commit()#执行后必须提交
articles = session.query(Article).all()#查询所有,可以遍历打印
articles = session.query(Article.price).all()#只显示某个字段的所有数据
result = session.query(func.count(Article.id)).first()
print(result)#聚合函数的使用,包括(avg、max、min、count、sum、)但是必须导入func
条件查询:
res = session.query(Article).filter(Article.id==1)*或者filter_by(id=1)*.first()#相等直接用=
filter(Article.title.notin_(['title20','title99']))#like、in、not in、and、or括号内接条件,使用有各自的语法
Column常用参数
update_time = Column(DateTime,onupdate=datetime.now,default=datetime.now)
title = Column(String(50),nullable=False,name='my_title')
在表中为’my_title’flask_sqlalchemy
Flask-SQLAlchemy
是对SQLAlchemy
进行了一个简单的封装,使得我们在flask
中使用sqlalchemy
更加的简单
#导包量减少,书写简便,三行即可初始化数据库
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from constants import DB_URI
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
db = SQLAlchemy(app)
创建表格前直接省略了创建基类,直接调用db.Model属性,且session成为db的一个属性,不用再make_session实例化后再使用
class UserModel(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(50),nullable=False)
.
.
db.session.add()#添加后提交
db.session.commit()
了解flask_migrate需要先了解flask-script,那么flask-script的作用是什么呢?flask-script的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand#导入 Migrate,MigrateCommand
from app import app,db
manager =Manager(app)
Migrate(app,db) #要让Flask-Migrate能够管理app中的数据库,需要使用Migrate(app,db)来绑定`app`和数据库
manager.add_command("db",MigrateCommand)#创建命令 "db"这个可以随便起名,初始化迁移文件夹的时候,终端要一致
python manage.py db init#初始化迁移文件夹,执行一次就可以了
python manage.py db migrate#模型迁移到目录中
python manage.py db upgrade#映射到数据库
#若要使用
flask db init
需要先执行FLASK_APP='your_app.py'
映射完成后就是表格的增删改查,此时已经不再需要全部删除再改了
users = User.query.filter(User.id==1).first()
db.session.delete(users)#删除
db.session.commit()#仍然别忘记提交