1.Flask_SQLAlchemy创建数据库
Flask_SQLAlchemy整合了Flask和SQLAlchemy的功能,让我们能够使用更少的代码实现在网站中调用数据库的功能。
首先使用命令在终端窗口安装Flask_SQLAlchemy,
pip install flask_sqlalchemy
接下来我们在app实例文件中,为app绑定数据库。
首先实例化app,
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__) # 实例化app对象
接下来,输入数据库格式化字符串,如,
HOSTNAME = '127.0.0.1'
PORT = '3306'
USERNAME = 'root'
PASSWORD = '******'
DATABASE = 'test'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
为app对象的配置文件添加SQLALCHEMY_DATABASE_URI和SQLALCHEMY_TRACK_MODIFICATIONS参数,其中SQLALCHEMY_DATABASE_URI的参数为数据库格式化字符串DB_URI;SQLALCHEMY_TRACK_MODIFICATIONS默认开启,开启此选项会占用大量内存,所以我们关闭它,
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
Flask_SQLAlchemy将SQLAlchemy的功能进行了整合,我们之前介绍的SQLAlchemy方法都可以通过数据库变量来引用,不需要再一一导入,只需实例化数据库对象,
db = SQLAlchemy(app)
# 之后所有的SQLAlchemy都可以通过“db.方法名”来调用,如,db.Column,db.String等
我们下面来构建两个ORM模型,分别为Student表和StudentExtend表。Student表中有id字段(数值型,主键,自增)、name字段(字符型,非空)、age字段(数值型)、sex字段(枚举型,值为“男”或“女”);StudentExtend表有num字段(数值型,主键,自增)、name字段(字符型,非空)、id字段(数值型,外键对应Student表的id字段)、rank字段(数值型)、hobby字段(字符串类型),两张表为一对多的关系。代码如下,
class Student(db.Model): # 继承于db.Model类
__tablename__ = 'student'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(10), nullable=False)
age = db.Column(db.Integer)
sex = db.Column(db.Enum("男", "女"))
def __repr__(self):
return 'Student(name:{}, age:{}, sex:{})'.format(self.name, self.age, self.sex)
class StudentExtend(db.Model):
__tablename__ = 'student_extend'
num = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(10), nullable=False)
id = db.Column(db.Integer, db.ForeignKey('student.id'))
rank = db.Column(db.Integer)
hobby = db.Column(db.String(50))
student = db.relationship("Student", backref="extends")
def __repr__(self):
return 'StudentExtend(name:{}, rank:{}, hobby:{})'.format(self.name, self.rank, self.hobby)
db.drop_all() # 删除所有ORM模型
db.create_all() # 创建所有ORM模型
最后添加视图函数,
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
这样,我们启动后数据库会被自动创建。
我们为了简化代码,可以新建一个config.py文件,将app实例文件中的数据库格式化字符串剪切到config.py文件中,并进行修改,
HOSTNAME = '127.0.0.1'
PORT = '3306'
USERNAME = 'root'
PASSWORD = '******'
DATABASE = 'test'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
同时,在app实例文件中导入config.py,在实例化app对象后添加以下代码,
import config
app.config.from_object(config)
2.数据操作
Flask_SQLAlchemy中对数据的操作与SQLAlchemy中基本相同。
我们来添加几个数据,
student1 = Student(name='zhao', age=23, sex="女")
student2 = Student(name='qian', age=20, sex="男")
extend1 = StudentExtend(name='zhao', rank=1, hobby="conding")
extend2 = StudentExtend(name='qian', rank=4, hobby="math")
extend1.student = student1
extend2.student = student2
db.session.add_a。ll([extend1, extend2])
db.session.commit()
我们来查询age为23的学生对应的extend,
student1 = db.session.query(Student).filter(Student.age == 23).first()
print(student1.extends)
执行后,会返回student1.extends的结果如下,
[StudentExtend(name:zhao, rank:1, hobby:conding)]
我们将其年龄修改为27,并返回,
student1.age = 27
db.session.commit()
print(student1)
返回,
Student(name:zhao, age:27, sex:女)
我们删除该数据,
db.session.delete(student1)
db.session.commit()
3.命令行执行函数方法
3.1.添加命令行方法
我们可以使用Flask_Script来实现终端命令行执行特定函数。
首先,我们来新建一个manage.py文件,代码如下,
from flask_script import Manager
manager = Manager(app)
if __name__ == '__main__':
manager.run()
这是一个入口文件的标准形式,我们接下来为入口添加命令行方法greet,该方法固定返回“hello world”,
@manager.command # 为manager添加新命令行命令
def greet():
return "hello world"
这样,我们可以在终端窗口输入以下代码,
python manage.py greet
终端会返回,
hello world
我们同样可以,将方法写入其他文件再导入到入口文件中,实现同样的效果。例如,我们新建一个db_script.py文件来写入相关方法,
from flask_script import Manager
db_manager = Manager()
@db_manager.command
def init():
return "初始化迁移脚本"
@db_manager.command
def revision():
return "生成迁移脚本"
@db_manager.command
def upgrade():
return "脚本映射到数据库成功"
在入口文件中添加以下代码,
from db_script import db_manager
manager.add_command("db", db_manager) # 为manager添加db_manager的方法
# 第一个参数为方法前缀,所有的db_manager方法都要通过“前缀名 方法名”的形式在终端中运行
我们在终端中输入,
python manage.py db init
返回,
初始化迁移脚本
3.2.添加需要传参数的命令行方法
如果,我们添加的命令行方法需要我们传参,需要在方法前添加@manager.option(“参数前缀名”, “参数名”, dest=“对应参数”)实现传参,例如,我们添加一个add_student()方法来向数据库中的Student表添加数据,
from app import app, db, Student # 从app实例文件中导入相关对象
@manager.option("-n", "--name", dest="name") # 指定-n为传递add_student的name参数
@manager.option("-a", "--age", dest="age") # 指定-a为传递add_student的age参数
@manager.option("-s", "--s", dest="sex") # 指定-s为传递add_student的sex参数
def add_student(name, age, sex):
student = Student(name=name, age=age, sex=sex)
db.session.add(student)
db.session.commit()
我们来添加一条数据,
manage.py add_student -n sun -a 25 -s 女
这样数据库中就多了一条相应数据。
本文介绍了如何使用Flask_SQLAlchemy整合Flask和SQLAlchemy,实现数据库创建、数据操作以及通过命令行执行特定函数。详细讲解了数据库配置、ORM模型创建、数据的增删查改,并展示了如何利用Flask_Script添加命令行方法,包括固定返回的greet方法和需要传参数的add_student方法。
9335

被折叠的 条评论
为什么被折叠?



