热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flask框架下MySQL数据库的集成与应用

本文详细探讨了如何在Flask框架中集成和使用MySQL数据库,通过具体的实例和代码演示,帮助开发者更好地理解和掌握Flask与MySQL的结合使用。

本文旨在为读者提供在Flask框架中集成MySQL数据库的方法和技巧,特别是在实际项目中应用这些技术的指导。虽然许多教程倾向于使用SQLite作为示例数据库,以简化教学过程,但在生产环境中,MySQL因其强大的功能和稳定性而更为常用。因此,了解如何在Flask中配置和使用MySQL是非常有价值的。


环境说明:

操作系统:Ubuntu 16.04 4.8.0-36-generic(运行于VMware虚拟机上)


  1. 首先需要明确的是,在Flask-SQLAlchemy中使用MySQL时,不会像SQLite那样自动创建数据库。因此,您需要先手动创建MySQL数据库,之后才能利用Flask-SQLAlchemy进行数据操作。具体步骤如下:
    • 通过命令行登录MySQL:使用命令 mysql -u root -p 登录,并输入安装MySQL时设置的密码。
    • 创建数据库:编写SQL脚本文件(如 data_test.sql),并在MySQL中执行此脚本来创建数据库。例如,可以在脚本所在目录下执行 source data_test.sql 命令。如果不在脚本目录下,则需要提供完整的文件路径。

    下面是一个简单的 data_test.sql 脚本示例,用于创建两个基本的表结构——rolesusers

    DROP DATABASE IF EXISTS data_test;
    CREATE DATABASE data_test;
    USE data_test;

    CREATE TABLE roles (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) COLLATE utf8_bin NOT NULL,
    UNIQUE (name),
    permissions INT(11),
    `default` BOOLEAN DEFAULT FALSE,
    INDEX(`default`),
    PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    AUTO_INCREMENT=1;

    CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT,
    username VARCHAR(255) COLLATE utf8_bin NOT NULL,
    UNIQUE (username),
    email VARCHAR(255) COLLATE utf8_bin NOT NULL,
    UNIQUE (email),
    INDEX(username,email),
    password_hash VARCHAR(255) COLLATE utf8_bin NOT NULL,
    role_id INT(11),
    confirmed BOOLEAN DEFAULT FALSE,
    name VARCHAR(255),
    location VARCHAR(255),
    about_me TEXT,
    member_since datetime DEFAULT CURRENT_TIMESTAMP,
    last_seen datetime DEFAULT CURRENT_TIMESTAMP,
    avatar_hash VARCHAR(255),
    followed INT(11),
    followers INT(11),
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    PRIMARY KEY (id)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    AUTO_INCREMENT=1;

    执行上述脚本后,您应该能够在MySQL中看到新创建的表。

  2. 接下来,需要在Flask应用程序的配置文件中设置数据库连接信息。通常,这涉及到修改 SQLALCHEMY_DATABASE_URI 配置项,例如:
  3. class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:[email protected]:3306/data_test'

    完成以上配置后,Flask-SQLAlchemy即可通过ORM(对象关系映射)方式访问MySQL数据库,无需直接在MySQL命令行中进行复杂操作。

  4. 在实践中,将Flask-SQLAlchemy的关系模型映射到MySQL数据库中可能会遇到一些挑战,特别是对于初学者而言。其中,理解 db.relationship 的工作原理至关重要。例如,当我们在 roles 表中定义 users = db.relationship('User', backref='role', lazy='dynamic') 时,实际上是告诉SQLAlchemy,每个角色可以关联多个用户,同时在 users 表中定义了一个外键 role_id,指向 roles 表的主键 id。如果试图向 users 表插入一个不存在于 roles 表中的 role_id,将会导致错误。

此外,backref 参数允许我们从用户对象直接访问相关联的角色对象,而无需额外定义反向关系。设置 lazy='dynamic' 则意味着查询时不会立即加载所有相关记录,而是返回一个查询对象,从而允许进一步的查询定制。

参考资源包括但不限于MySQL官方文档、Flask-SQLAlchemy官方文档以及相关的社区论坛讨论,这些资料对于深入理解和解决实践中遇到的问题非常有帮助。


推荐阅读
author-avatar
天才野猪518
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有