欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Flask 系列之 SQLAlchemy

程序员文章站 2022-04-19 10:29:08
SQLAlchemy 是一种 ORM 框架,通过使用它,可以大大简化我们对数据库的操作,不用再写各种复杂的 了。 说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 实现网站与 mysql 数据库的连接和 C ......

Flask 系列之 SQLAlchemy

sqlalchemy 是一种 orm 框架,通过使用它,可以大大简化我们对数据库的操作,不用再写各种复杂的 sql语句 了。

说明

  • 操作系统:windows 10
  • python 版本:3.7x
  • 虚拟环境管理器:virtualenv
  • 代码编辑器:vs code

实验目标

实现网站与 mysql 数据库的连接和 crud 操作。

mysql 的安装与配置

打开 ubuntu 16.04 的 bash 界面,执行下述操作

# 安装
sudo apt update && sudo apt install mysql-server mysql-client
sudo service mysql status

# 配置安全性
sudo mysql_secure_installation
sudo mysqladmin -p -u root version

# 查看状态
sudo service mysql status
sudo service mysql start
sudo service mysql stop

# 设置字符编码
sudo vim /etc/mysql/conf.d/mysql.cnf

# 修改如下:
[mysql]
no-auto-rehash
default-character-set=utf8
[mysqld]
socket = /var/run/mysqld.sock
port =3306
character-set-server=utf8  # 必须设置,否则会导致无法插入中文数据

# 重启服务
sudo service mysql restart

mysql 常用用法

# 进入 mysql
mysql -u root -p

# 查看当前字符编码
show variables like 'character%';

# 创建数据库 db_name
create database db_name charset=utf8;

# 显示以存在的所有数据库
show databases;

# 指定数据库 db_name
use db_name;

# 创建数据库表
create table table_name;

# 查看表信息
desc tablename;

# 删除 数据库 db_name
drop database db_name;

# 退出
exit;

使用 sqlalchemy

首先进入 mysql 的控制台界面,创建我们需要使用的数据库

sudo mysql -u root -p
create database todo;
use todo;

安装 flask-sqlalchemy

pip install pymysql
pip install flask-sqlalchemy

todolist 目录下创建 config.py 文件,示例代码如下所示:

import os

basedir = os.path.abspath(os.path.dirname(__file__))


class config(object):
    sqlalchemy_database_uri = os.environ.get(
        'sqlalchemy_database_uri') or 'mysql+pymysql://root:mysql@127.0.0.1:3306/todo'
    sqlalchemy_track_modifications = false

修改 todolist\app\__init__.py,示例代码如下所示:

from flask import flask, render_template
from flask_sqlalchemy import sqlalchemy
from config import config

app = flask(__name__)
app.config.from_object(config)
db = sqlalchemy(app)


@app.route('/')
@app.route('/index')
def index():
    title = 'home'
    greet = 'hello world'
    return render_template('index.html', title=title, greet=greet)

todolist 目录下创建 models.py 文件,示例代码如下所示:

from app import db
from datetime import datetime


class user(db.model):
    __tablename__ = 'users'
    # __table_args__ = {"useexisting": true}

    id = db.column(db.integer, primary_key=true)
    name = db.column(db.string(20), nullable=false, unique=true)
    email = db.column(db.string(120), nullable=false, unique=true)
    pwd = db.column(db.string(120), nullable=false)

    things = db.relationship('thing', backref='user', lazy='dynamic')

    def __repr__(self):
        return "<user %r>" % self.name


class thing(db.model):
    __tablename__ = 'things'
    # __table_args__ = {"useexisting": true}

    id = db.column(db.integer, primary_key=true)
    user_id = db.column(db.integer, db.foreignkey('users.id'))
    title = db.column(db.string(20), nullable=false)
    text = db.column(db.text, nullable=false)
    add_date = db.column(db.datetime, default=datetime.now)

    def __repr__(self):
        return "<todo %r>" % self.id

修改 todolist\manage.py,示例代码如下所示:

from app import app, db
from models import user, thing
from werkzeug.security import generate_password_hash

if __name__ == "__main__":
    db.drop_all()
    db.create_all()

    pwd = generate_password_hash('123456789')
    u1 = user(name='admin', email='admin@outlook.com', pwd=pwd)
    db.session.add(u1)
    db.session.commit()

    t1 = thing(user_id=1, title='hello world', text='welcome to my hippiedom.')
    db.session.add(t1)
    db.session.commit()

    u2 = user.query.get(1)
    print(u2)

    app.run(debug=true, host='0.0.0.0', port=5000)

此时,执行 python manage.py,若程序无数据库相关的错误信息,则表明数据库中相应表已经创建成功,我们可以在 mysql 的 shell 窗口进行查看。

参考