复盘Flask-web网页开发——数据库

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

如果还没有创建数据库和表,这个命令会自动创建,如果已经创建,则会在不损坏数据的前提下执行更新。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咻白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值