ORM框架之SQLAlchemy以及封装后的flask_sqlalchemy

什么是ORM
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。
什么是SQLAchemy
:Python编程语言下的一款ORM框架,将对象转换为SQL,然后使用数据API执行SQL并获取执行结果。以下两图可大致说明其工作方式
ORM框架之SQLAlchemy以及封装后的flask_sqlalchemy_第1张图片
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常用参数

  1. default 1~4 与sql中大差不差
  2. nullable
  3. primary_key
  4. autoincrement
  5. onupdate :更新的时候执行的函数egupdate_time = Column(DateTime,onupdate=datetime.now,default=datetime.now)
  6. name:改属性在数据库中的字段映射egtitle = Column(String(50),nullable=False,name='my_title')在表中为’my_title’
    sqlalchemy常用数据类型
    同sql相似,写法不同,会多一个“text”以及“longtext”类型

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_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()#仍然别忘记提交

你可能感兴趣的:(python,flask)