1. flask连接数据库
Flask操作数据库MySQL 先自行安装好MySQL。Flask想要操作数据库,必须要先安装Python操作 MySQL 的驱动。在Python中,目前有以下MySQL驱动包。
MySQL-python: 也就是MySQLdb。是对C语言操作 MySQL数据库的一个简单封装。遵循了Python-DB-API v2。但是只支持Python2。 mysqlclient: 是 MySQL-python的另外一个分支。支持Python3并且修复了一些bug。是目前为止执行效率最高的驱动,但是安装的时候容易因为环境问题出错。 pymysql: 纯 Python实现的一个驱动。因为是纯 Python编写的,因此执行效率不如 mysqlclient。也正因为是纯 Python写的,因此可以和 Python代码无缝衔接。 mysql-connector-python: MySQL官方推出的纯 Python连接MySQL的驱动,执行效率pymysql还慢。
一、创建一个SQLAlchemy的实例对象
模块flask_sqlalchemy中封装了模块SQLAlchemy的相关用法,我们需要先导入模块SQLAlchemy。
from flask_sqlalchemy import SQLAlchemy
为了使用类SQLAlchemy封装的功能,我们需要创建一个类SQLAlchemy的实例对象,将它命名为db,将flask的实例对象app作为参数传给SQLAlchemy,是为了将db和app联系起来,这样就能调用相关功能了。
db = SQLAlchemy(app)
二、在python中配置数据库信息
在app.config中设置好连接数据库的信息,db对象可以自动读取app.config中连接数据库的信息。注意编辑配置信息时区分大小写。
# MySQL所在主机名
HOSTNAME = "127.0.0.1"
# MySQL监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,自己设置
USERNAME = "root"
# 连接MySQL的密码,自己设置
PASSWORD = "root"
# MySQL上创建的数据库名称
DATABASE = "database_learn"
# 通过修改以下代码来操作不同的SQL比写原生SQL简单很多 --》通过ORM可以实现从底层更改使用的SQL
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
三、利用数据库开发工具Navicat连接MySQL
1、文件 -->新建连接-->MySQL
2、填写信息-->连接测试-->确定
3、新建数据库
四、测试连接MySQL是否成功
with app.app_context():
with db.engine.connect() as conn:
rs = conn.execute("select 1")
print(rs.fetchone())
返回 (1,),证明连接成功。
完整测试代码如下(navicat信息需要自己先配置好再通过flask去连接):
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
HOSTNAME = "127.0.0.1"
PORT = 3306
USERNAME = "root"
PASSWORD = "root"
DATABASE = "database_learn"
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 在app.config中设置好连接数据库的信息
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy(app)会自动读取app.config中连接数据库的信息
db = SQLAlchemy(app)
# 测试是否连接成功
with app.app_context():
with db.engine.connect() as conn:
rs = conn.execute("select 1")
print(rs.fetchone()) # (1,)
if __name__ == '__main__':
app.run()
# MySQL所在的主机名
HOSTNAME = "127.0.0.1"
# MySQL所在的端口号,默认是3306
PORT = 3306
# 连接MySQL的用户名,读者用自己设置的
USERNAME = "root"
# 连接MYSQL的密码,读者用自己的
PASSWORD = "123456"
# MySQL上创建的数据库名称
DATABASE = "database_learn"
app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8mb4"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# # 数据库的配置文件
# HOSTNAME = '127.0.0.1'
# PORT = '3306'
# DATABASE = 'database_learn'
# USERNAME = 'root'
# PASSWORD = '123456'
# DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE )
# SQLALCHEMY_DATABASE_URI= DB_URI
# SQLALCHEMY_TRACK_MODIFICATIONS = True
1. ORM模型
ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。
一个URM模型与数据库的一个表相对应,ORM模型中的每个类属性分别对应表的每一个字段,ORM模型的每个实例对象对应表的每条记录。
基本情况:
- 每个模型都是一个Python类,它是django.db.models.Model的子类。
- 模型的每个属性都代表一个数据库字段。
- 综上所述,Django为您提供了一个自动生成的数据库访问API,详询官方文档链接。
一、ORM模型与表的映射
表的创建:
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key= True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
with app.app_context():
db.create_all()#创建表
表创建完了之后开始一些增删改查操作
一、创建用户对象
@app.route("/user/add")
def add_user():
# 1.创建ORM对象
users=User(username="法外狂徒张三",password='111111');
db.session.add(users)
db.session.commit()
return "用户创建成功"
二、查找对象数据
@app.route("/user/query")
def query_user():
# 1.get根据主键查找
user= User.query.get(1)
print(f"{user.username}:{user.id}----{user.password}")
return "数据查找成功!"
三、修改对象数据
@app.route("/user/update")
def update_user():
# 1.get根据主键查找
user= User.query.filter_by(username="法外狂徒张三").first()
user.password="222222"
db.session.commit()
return "数据修改成功!"
四、删除对象数据
@app.route("/user/delete")
def del_user():
user = User.query.filter_by( username="法外狂徒张三" ).first()
db.session.delete(user)
db.session.commit()
return "数据删除成功!"
一、表关系
关系数据库一个强大的功能,就是多个表之间可以建立关系,表的关系分为三种:一对多、一对一、多对多。
1、外键
外键是数据库层面的技术。在flask-SQLAlchemy中支持创建ORM模型的时候指定外键,创建外键是通过db.ForeignKey实现的,比如我们这里创建一个Article表,这个表有一个author_id字段,通过外键引用user表中的id字段,用来保存文章是由谁编写的,Article的模型如下:
(2)一对一的关系
一对一的关系可以用一对多关系来表示,但调用 db.relationship() 时要把 uselist 设为 False , 把“多”变成“一”。
class Parent(db.Model):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
child = relationship("Child", uselist=False, backref="parent")
class Child(db.Model):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
(1)一对多的关系
我们要创建一对多的关系,首先得清楚,那个表是一,那个表是多
User就是那个一,Article是多,因为User是父表,Article是子表,作者的名字只能有一个,但是一个作者可以写多篇文章
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key= True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
class Article(db.Model):
__tablename__="article"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
tiltle=db.Column(db.String(200),nullable=False)
content=db.Column(db.Text,nullable=False)
author_id=db.Column(db.Integer,db.ForeignKey("user.id"))
author=db.relationship("User",backref="articles")
#而backref正好相反,提供了 User 对 Article 的访问
以上代码,除了添加常规的title、content属性外,还增加了author_id, author_id通过db.ForeignKey(”user_id”)引用了之前我们创建的User表的id字段,这里有个细节需要注意,author_id因为引用的User表的id字段,所以他们两个的类型必须一致,否则会报错。
因为外键(ForeighKey)始终定义在多的一方,如果relationship定义在多的一方,那就是多对一,一对多与多对一的区别在于其关联(relationship)的属性在多的一方还是一的一方,如果relationship定义在一的一方那就是一对多.
添加数据:
@app.route("/article/add")
def article_add():
article=Article(title="flask学习",content="flask1111")
article.author=User.query.get(1)
article2 = Article( title="Django学习", content="Django1111" )
article2.author = User.query.get(1)
db.session.add_all([article,article2])
db.session.commit()
return "article数据添加成功"
根据作者信息查询文章:
@app.route("/article/query")
def abs():
user=User.query.get(1)
for article in user.articles:
print(article.title)
return "文章查找成功"
(3)多对多的关系
一、flask_migrate迁移ORM
db = SQLAlchemy(app)
migrate = Migrate(app,db)
三个简单迁移的语句
1、flask db init ——创建迁移的环境, 来执行在项目目录产生一个migrations的文件夹用于存放初始化文件
2、flask db migrate ——生成迁移脚本,这条命令可以简单理解为在flask里对数据库(db)进行迁移(migrate)
3、flask db upgrade——更新数据库
生成了迁移脚本后,使用upgrade子命令即可更新数据库:
(Lenovo-ezd1lI9Y) D:\\flask\\FLASK_PRACTICE\\DataBase>flask db upgrade
INFO [alembic.runtime.migration] Context impl SQLiteImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 7f3dae8cae4d, add note timestamp
ERROR [root] Error: No support for ALTER of constraints in SQLite dialect
如果还没有创建数据库和表,这个命令会自动创建,如果已经创建,则会在不损坏数据的前提下执行更新。