Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展。
它需要 SQLAlchemy 0.6 或更高的版本。它致力于简化在 Flask 中 SQLAlchemy 的 使用,提供了有用的默认值和额外的助手来更简单地完成日常任务。
我的conda源没有,我就直接pip3


数据库连接:
1. 与sqlalchemy一样,定义好数据库连接字符串DB_URI。
2. 将这个定义好的数据库连接字符串DB_URI,通过SQLALCHEMY_DATABASE_URI这个键放到app.config中。示例代码:app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI.
3. 使用flask_sqlalchemy.SQLAlchemy类定义一个对象,并将app传入进去。示例代码:db = SQLAlchemy(app)。
创建ORM模型:
1. 与使用sqlalchemy一样,定义模型。现在不需要使用delarative_base来创建一个基类,而是使用db.Model来作为基类。
2. 在模型类中,Column、String、Integer以及relationship等,都不需要导入了,直接使用db下面相应的属性名就可以了。
3. 在定义模型的时候,可以不写__tablename__,那么flask_sqlalchemy会默认使用如果不设置该属性,类名小写作表名,
并且如果这个模型的名字使用多个单词且是驼峰命名法,则多个单词之间使用下划线来进行连接。
将ORM模型映射到数据库:
1. db.drop_all()
2. db.create_all()
使用session:
session也不需要使用sessionmaker来创建了。直接使用db.session且操作方式与SQLAl相同
查询数据:
如果查找数据只是查找一个模型上的数据,可以直接通过模型.query的方式进行查找。query就跟之前的sqlalchemy中的query方法是一样用的。
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) HOSTNAME = ‘127.0.0.1‘ PORT = ‘3306‘ DATABASE = ‘flask_sqlalchemy‘ USERNAME = ‘root‘ PASSWORD = ‘root‘ # dialect+driver://username:password@host:port/database DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8mb4".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE) app.config[‘SQLALCHEMY_DATABASE_URI‘] = DB_URI app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False db = SQLAlchemy(app) # 明言胜于暗喻 class User(db.Model): #__tablename__ = ‘user‘ 如果不设置该属性,类名小写作表名 id = db.Column(db.Integer,primary_key=True,autoincrement=True) username = db.Column(db.String(50),nullable=False) def __repr__(self): return "<User(username: %s)>" % self.username class Article(db.Model): __tablename__ = ‘article‘ id = db.Column(db.Integer,primary_key=True,autoincrement=True) title = db.Column(db.String(50),nullable=False) uid = db.Column(db.Integer,db.ForeignKey("user.id")) author = db.relationship("User",backref="artiles") db.drop_all() db.create_all() user = User(username=‘wqbin‘) article = Article(title=‘title one‘) sess=db.session article.author = user sess.add(article) sess.commit() users = User.query.order_by(User.id.desc()).all() print(users) user = User.query.filter(User.username==‘wqbin‘).first() user.username=‘wqbin1‘ sess.commit() @app.route(‘/‘) def hello_world(): return ‘Hello World!‘ if __name__ == ‘__main__‘: app.run()
SQLAlchemy该ORM框架本身没有带数据库版本控制功能,但是进行开发过程中难免修改数据模型,添加表,修改字段,都需要手动修改。于是两个解决该缺陷的两个工具应运而生,alembic与SQLAlchemy-Migrate。
alembic是sqlalchemy的作者开发的,Alembic 使用 SQLAlchemy 作为数据库引擎,为关系型数据提供创建、管理、更改和调用的管理脚本,协助开发和运维人员在系统上线后对数据库进行在线管理,主要用来做ORM模型与数据库的迁移与映射。
alembic使用方式跟git类似,表现在两个方面
以下将解释alembic的用法:
细节如下:
1.alembic init alembic

2.alembic.init
from sqlalchemy import Column,String,Integer,create_engine from sqlalchemy.ext.declarative import declarative_base DB_USERNAME = ‘root‘ DB_PASSWORD = ‘root‘ DB_HOST = ‘127.0.0.1‘ DB_PORT = ‘3306‘ DB_NAME = ‘alembic‘ DB_URI = ‘mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8‘ % (DB_USERNAME,DB_PASSWORD,DB_HOST,DB_PORT,DB_NAME) engine = create_engine(DB_URI) Base = declarative_base(engine) class User(Base): __tablename__ = ‘user‘ id = Column(Integer,primary_key=True,autoincrement=True) username = Column(String(50),nullable=False) country = Column(String(50))
3.修改配置文件alembic.init
【alembic】 sqlalchemy.url = driver://user:pass@localhost/dbname 改成: 【alembic】 sqlalchemy.url = mysql+pymysql://root:root@localhost/alembic?charset=utf8
4.修改env.py
from __future__ import with_statement from logging.config import fileConfig from sqlalchemy import engine_from_config from sqlalchemy import pool from alembic import context import sys,os sys.path.append(os.path.dirname(os.path.dirname(__file__))) import models # this is the Alembic Config object, which provides access to the values within the .ini file in use. config = context.config # Interpret the config file for Python logging. This line sets up loggers basically. fileConfig(config.config_file_name) # add your model‘s MetaData object here for ‘autogenerate‘ support from myapp import mymodel target_metadata = mymodel.Base.metadata target_metadata = models.Base.metadata

原文:https://www.cnblogs.com/wqbin/p/11965888.html