- 跟sqlalchemy一样,定义好数据库连接字符串DB_URI。
- 将这个定义好的数据库连接字符串DB_URI,通过`SQLALCHEMY_DATABASE_URI`这个键放到`app.config`中。示例代码:`app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI`.
- 使用`flask_sqlalchemy.SQLAlchemy`这个类定义一个对象,并将`app`传入进去
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'flask_sqlalchemy_demo'
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
db = SQLAlchemy(app)
class User(db.Model): # 继承db.Model,相当于SQLAlchemy的Base
__tablename__ = 'user_model'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(50), nullable=False)
def __repr__(self):
return self.username
db.create_all()
session不需要使用sessionmaker
来创建了。直接使用db.session
。
user = User.query.filter(User.username=='tian').first()
user.username = 'tian6'
db.session.commit()
user = db.session.query(User).all()
print(user)
user = User.query.filter(User.username=='tian6').first()
db.session.delete(user)
db.session.commit
Flask-Script的作用是可以通过命令行的形式来操作Flask。例如通过命令跑一个开发版本的服务器、设置数据库,定时任务等。
使用manage.commad:这个方法是用来添加那些不需要传递参数的命令
from flask_script import Manager
manager = Manager(app)
@manager.command # 自定制命令
def greet():
print('你好')
使用manage.option:这个方法是用来添加那些需要传递参数的命令。有几个参数就需要写几个option。
# 添加用户
@manager.option("-u", "--username", dest="username")
@manager.option("-e", "--email", dest="email")
def add_user(username, email):
user = User(username=username, email=email)
db.session.add(user)
db.session.commit()
db_script.py
from flask_script import Manager
db_manager = Manager()
@db_manager.command
def init():
print('迁移仓库创建完毕!')
@db_manager.command
def revision():
print('迁移脚本生成成功!')
@db_manager.command
def upgrade():
print('脚本映射到数据库成功!')
manage.py
from db_script import db_manager
manager = Manager(app)
manager.add_command("db", db_manager) # 子命令 db upgrade
数据库迁移
manage.py
from flask_script import Manager
from bbs import app
from exts import db
from flask_migrate import Migrate, MigrateCommand
# 需要把映射到数据库中的模型导入到manage.py文件中
from models import User
manager = Manager(app)
# 用来绑定app和db到flask_migrate的
Migrate(app, db)
# 添加Migrate的所有子命令到db下
manager.add_command("db", MigrateCommand)
if __name__ == '__main__':
manager.run()
bbs.py
from flask import Flask
import config
from exts import db
app = Flask(__name__)
app.config.from_object(config) #引入配置文件
db.init_app(app) # 初始化app
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
exts.py 为了解决循环引用问题
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
models.py
from exts import db
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
username = db.Column(db.String(50),nullable=False)
age = db.Column(db.Integer)
基于alembic实现的,alembic中的命令在flask-migrate中都可以使用
1. 初始化一个环境:python manage.py db init
2. 自动检测模型,生成迁移脚本:python manage.py db migrate
3. 将迁移脚本映射到数据库中:python manage.py db upgrade
4. 更多命令:python manage.py db --help