在Flask中使用mySQL

在“FlaskWeb开发:基于Python的Web应用开发实战“一书中,作者为了简便以及更侧重于Flask而不是数据库的说明,所以书中使用了SQLite数据库。

但是实际应用中mySQL应该更广泛一些。所以尝试使用mySQL替代书中原代码中SQLite数据库的功能。

平台说明:

Ubuntu 16.04 4.8.0-36-generic (安装在VMware上)

  1. 第一个需要注意的就是,与SQLite不同的是,Flask-SQLAlchemy并不会为mySQL主动去建立一个database。所以需要自己手动在mySQL中建立一个相应的数据库,然后才能使用Flask-SQLAlchemy对相应数据进行查找,验证等操作。如果没有事先创建,是不能使用mySQL的。
    所以第一个步骤就是在mySQL上创建数据库,这里使用sql脚本进行创建,并且使用的是本机的mySQL。
    使用命令:mysql -u root -p
    然后输入安装mySQL时设置的密码登入mySQL。
    然后使用命令:source data_test.sql执行事先写好的sql脚本,创建相应数据库。这里我实在脚本目录执行的,如果不是需要指定完整路径。
    data_test.sql文件内容如下。改脚本与书中的models.py内容对应。表,表头一一对应,但是功能不一定能一一对应,对mySQL不是很熟悉。

     1 drop database if exists data_test;
     2 create database data_test;
     3 use data_test;
     4 CREATE TABLE roles(
     5     id INT(11) NOT NULL AUTO_INCREMENT,
     6     name VARCHAR(255) COLLATE utf8_bin NOT NULL,
     7     UNIQUE (name),
     8     permissions INT(11),
     9     `default` BOOLEAN DEFAULT FALSE,
    10     INDEX(`default`),
    11     PRIMARY KEY (id)
    12 ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    13 AUTO_INCREMENT=1;
    14
    15 CREATE TABLE users(
    16     id INT(11) NOT NULL AUTO_INCREMENT,
    17     username VARCHAR(255) COLLATE utf8_bin NOT NULL,
    18     UNIQUE (username),
    19     email VARCHAR(255) COLLATE utf8_bin NOT NULL,
    20     UNIQUE (email),
    21     INDEX(username,email),
    22     password_hash VARCHAR(255) COLLATE utf8_bin NOT NULL,
    23     role_id INT(11),
    24     confirmed BOOLEAN DEFAULT FALSE,
    25     name VARCHAR(255),
    26     location VARCHAR(255),
    27     about_me TEXT,
    28     member_since datetime DEFAULT CURRENT_TIMESTAMP,
    29     last_seen datetime DEFAULT CURRENT_TIMESTAMP,
    30     avatar_hash VARCHAR(255),
    31     followed INT(11),
    32     followers INT(11),
    33     FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
    34     PRIMARY KEY (id)
    35 ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    36 AUTO_INCREMENT=1;
    37
    38 CREATE TABLE posts(
    39     id INT(11) NOT NULL AUTO_INCREMENT,
    40     body TEXT,
    41     body_html TEXT,
    42     timestamp datetime DEFAULT CURRENT_TIMESTAMP,
    43     INDEX(timestamp),
    44     author_id INT(11),
    45     FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE,
    46     PRIMARY KEY (id)
    47 ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    48 AUTO_INCREMENT=1;
    49
    50 CREATE TABLE follows(
    51     follower_id INT(11),
    52     constraint con_follower FOREIGN KEY (follower_id) REFERENCES users(id),
    53     followed_id INT(11),
    54     constraint con_followed FOREIGN KEY (followed_id) REFERENCES users(id),
    55     PRIMARY KEY (follower_id,followed_id),
    56     timestamp datetime DEFAULT CURRENT_TIMESTAMP
    57 )ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    58
    59 CREATE TABLE comments(
    60     id INT(11) NOT NULL AUTO_INCREMENT,
    61     body TEXT,
    62     body_html TEXT,
    63     timestamp datetime DEFAULT CURRENT_TIMESTAMP,
    64     INDEX(timestamp),
    65     disabled BOOLEAN,
    66     author_id INT(11),
    67     post_id INT(11),
    68     FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE,
    69     FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE CASCADE,
    70     PRIMARY KEY (id)
    71 ) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    72 AUTO_INCREMENT=1;

    执行后,mySQL应该可以查询到新建的表。

  2. config文件中对数据库进行设置

    SQLALCHEMY_DATABASE_URI 使用的如下配置:
    class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:[email protected]:3306/data_test"
    然后就可以使用Flask-SQLAlchemy对数据库进行操作,而不必去mySQL中操作了。

整个过程中对我来说,比较困难的应该算是将Flask-SQLAlchemy中的关系映射到mySQL数据库中,其中有个地方值得注意:

  • SQLAlchemy中的relationship。
    例如:roles表中有users = db.relationship(‘User‘, backref=‘role‘, lazy=‘dynamic‘)这句。对应到mySQL其实就是一个外键,并且是在users表中定义的,即users中的role_id都必须是从表roles的id字段中引用过来的。如果在users中添加一个role,并且其id并不存在与role中,那么就会报错。
    其中的参数backref表明该关系为双向,这样就不需要再users再定义一个relationship了。而lazy设为dynamic即表明查询的时候不直接加载结果,而是返回一个查询对象,这样就可以加过滤对查询结果进行筛查。

实践过程中参考了下面链接:

对外建的理解

外键constraint关键字

原文地址:https://www.cnblogs.com/xieshiqing/p/flask_mySQL.html

时间: 2024-12-23 12:44:33

在Flask中使用mySQL的相关文章

Flask中使用mysql

Flask中使用mysql 先安装相关模块: pip  install  Flask-MySQL 先准备一下数据库 登录: mysql  -u  root  -p 创建Database和创建Table mysql> CREATE DATABASE EmpData; mysql> use EmpData; mysql> CREATE TABLE User( userId INT NOT NULL AUTO_INCREMENT, userName VARCHAR(100) NOT NULL,

Flask 中 @app.before_request、@app.after_request 和 @app.teardown_request

Flask 中 @app.before_request.@app.after_request 和 @app.teardown_request flask中又两种 context(上下文),分别是 application context 和 request context. 其中 request 就是 request context.当 HTTP 请求过来的时候,进入这个上下文. 题主的那些方法都是一些 flaks 的 hooks.用于针对 request 做一些操作,比如 before_requ

整合Flask中的目录结构

一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignK

flask框架----整合Flask中的目录结构

一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignK

flask 中的常用组件的使用 ,virtualenv组件和 pipreqs组件

一  . flask 中连接的数据库的组件 DButils #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql from DBUtils.PooledDB import PooledDB, SharedDBConnection POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=20, # 连接池允许的最大连接数,0和None表示不限制连接数 mincach

Flask中的session ,自定义实现 session机制, 和 flask-session组件

session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:‘xxxxxx’}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 :Flask中的session是存在浏览器中 默认key是session(加密的cookie), 也可以像Django一样基于上述的方式实现保存在数据库 1 flask中 session的基本概念 flask 有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookie

flask 中的ORM

1 响应(response) 1 什么是响应 响应就是由服务器端带给客户端的内容,对应着请求,响应可以是普通的字符串,模板 或重定向 return '普通字符串' return render_template('xxx.html') 2 响应对象 响应对象:将响应的内容封装到一个对象中,可以完成更多的响应的行为(如:增加cookies,..) 在Flask中,使用 make_response() 构建响应对象 2 文件上传 1 注意问题 表单中如果有文件上传的话,必须遵循以下两个要求 1 提交方

使用Flask来实现mysql的基本操作与cp源码出售

为了简化数据库操作,cp源码出售[企鹅21717-93408]我们将使用SQLAlchemy一个数据库工具(ORM,即对象关系映射).借助SQLAlchemy,你可以通过定义Python类来表示数据库里的一张表(类属性表示表中的字段/列),通过对这个类进行各种操作来代替写SQL语句.这个列我们称之为模型类,类中的属性我们将称之为字段. Flask有大量的第三方扩展,这些扩展可以简化和第三方库的集成工作. 首先我们要"初始化"操作.导入扩展类,实例化并传入Flask程序实例:from f

Flask学习【第11篇】:整合Flask中的目录结构

SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignKey