Flask-SQLAlchemy

1、 Flask-SQLAlchemy的使用

①连接数据库

  1. 跟sqlalchemy一样,定义好数据库连接字符串DB_URI。
  2. 将这个定义好的数据库连接字符串DB_URI,通过`SQLALCHEMY_DATABASE_URI`这个键放到`app.config`中。示例代码:`app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI`.
  3. 使用`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)

 ②创建ORM模型

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

 ③将ORM模型映射到数据库

db.create_all()

 ④使用session操作数据

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

 

2、flask-script

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

3、flask-migrate

数据库迁移

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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值