flask-sqlalchemy插件使用

1.Flask-SQLAlchemy插件的使用

  • 该插件对SQLAlchemy进行了简单的封装,使得我们可以更加简单的使用。
  1. 初始化数据库,无需导入create_engine
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
HOSTNAME = '127.0.0.1'
DATABASE = 'flask_sqlalchemy'
PORT = 3306
USERNAME = 'root'
PASSWORD = 'root'

DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

app = Flask(__name__)

# 映射数据库
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
  1. 对于orm的使用,此前使用Base = declarative_base()初始化初类,在该插件中更加简单,全部继承Model类即可

class User(db.Model):
    __tablename__ = 'user'#表格可以有可以没有,表名会自动小写

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50))

    def __repr__(self):
        return 'User(name:{})'.format(self.name)
        
class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(50))
    uid = db.Column(db.Integer, db.ForeignKey('user.id'))

    author = db.relationship('User', backref='articles')
  • 所有的类都继承db.Model,同时相关Column字段的属性都成为db的属性。
  1. 创建表格和更新数据更加简单
db.drop_all()
db.create_all()

# 添加数据
# user = User(name='duke')
# article=Article(title='python')
#
# article.author = user
# db.session.add(article)
# db.session.commit()


# 查询数据:直接将query属性放在db.Modedl之上
# user = User.query.all()
# print(user)
加上session一样可以
# user = db.session.query(User).all()
# print(user)

#删除数据
user = User.query.filter(User.name =='lihua').first()
db.session.delete(user)
db.session.commit()

2.Flask-Script

  • Flask-Script:可以通过命令行的方式操作Flask。通过命令跑一个开发版本的服务器,设置数据库等等。
from flask_script import Manager
from flask_sqlchemy import app

manage = Manager(app)


@manage.command
def index():
    return 'hello'


@manage.option('-n', '--name', dest='name')
@manage.option('-u', '--url', dest='url')
def hello(name, url):
    print('hello', name, url)


if __name__ == '__main__':
    manage.run()
  • 将脚本命令放在manage.py文件夹中,在终端运行python manage.py -n --duke 就可以输出duke
    定义命令的三种方式
  1. 使用@command装饰器
from flask_script import Manager
from flask_sqlalchemy import app

manager = Manager(app)

@manager.command
def hello():
    print('hello')

if __name__ == '__main__':
    manager.run()
  1. 使用类继承Command类
from flask_script import Command,Manager
from flask_sqlalchemy import app

manager = Manager(app)

class Hello(Command):
	option_list = (
	Option('--name','-n',dest='name'),
)#在类中添加参数    
"prints hello world"

    def run(self):
        print("hello world")

manager.add_command('hello',Hello())


#使用类的方式:
1.必须继承Command基类
2.必须实现run方法
3.必须通过add_command方法添加命令
  1. 使用option装饰器:可以在装饰器里传递相应的参数
@manager.option('-n','--name',dest='name')
def hello(name):
    print('hello ',name)

用法:

python manage.py -n duke
python manage.py --name duke
  • 可以通过使用get_options方法动态的做一些事情。
class Hello(Command):
  def __init__(self,default_name='Joe'):
self.default_name = default_name

  def get_options(self):
      return [
          Option('-n','--name',dest='name',default=self.default_name),
      ]

  def run(self,name):
      print('hello',name)

3.Flask_Migrate

  • 在开发过程中,经常会发生数据库修改的行为,当数据较少的时候,可以轻易手动修改数据库,在orm模型中,我们可以直接修改模型再将其映射到数据库里,工具flask_migrate是基于Alembic进行的一个封装,它可以跟踪模型的变化,并将变化映射到数据库中。
  • 使用flask_migrate管理app中的数据库,需要使用migrate(app,db)来绑定app和数据库。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from constants import DB_URI
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
# 绑定app和数据库
migrate = Migrate(app,db)

class User(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(20))

    addresses = db.relationship('Address',backref='user')

class Address(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    email_address = db.Column(db.String(50))
    user_id = db.Column(db.Integer,db.ForeignKey('user.id'))

db.create_all()

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()
  • manage.py文件:该文件主要用于存放映射数据库的命令MigrateCommand是集成的一个命令,添加到脚本命令中,需要采用manager.add_command(‘db’,MigrateCommand)的方式,在终端执行python manage.py db xxx就是执行该命令。
from flask_script import Manager
from flask_migrate import MigrateCommand, Migrate
from exts import db
from demo import app
from models import User

manage = Manager(app)
Migrate(app, db)
manage.add_command("db", MigrateCommand)

if __name__ == '__main__':
    manage.run()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值