flask扩展模块flask-sqlachemy 的使用---mysql数据库

来源:互联网 发布:dnf阿里云搭建 编辑:程序博客网 时间:2024/04/30 19:29

该篇博客配置环境为:python版本3.5,flask2.0,python3中已经不再支持MySQLdb模块,所有这里我用了pymysql,所有使用前应该

安装pymysql:pip install pymysql

在网上的好多资料都给的是使用sqlite的例子,由于很不喜欢所以今天分享一下flask-sqlalchemy操作mysql的方法.

以前习惯使用sqlalchemy,后来发现使用flask-sqlchemy还是要简单一些(起码省去了好多模块和类的导入,create_engine,sessionmaker,declarative。。。)不过flask官方的例子用的是sqlchemy,去官网, flask-sqlalchemy官方文档

  这里写一个简单的flask web程序,来说明flask-sqlalchemy如何驱动msyql数据库.为了偷懒,这个例子以上一篇博文flask蓝图的使用为基础.

 

首先看一下程序结构:

 相比上一节只多了两个文件,create_db.py,models.py

 

1.建立mysql和app的连接

在config.py中加入以下两项配置:

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxxxx@localhost:3306/test?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = True

如此在app/__init__.py中加入
app.config.
from_object('config')
db = SQLAlchemy(app)
就可以完成app和数据的关联,并生成一个可以操作app数据库的SQLAlchemy实例db

完整的app/__init__.py代码如下:
from flask import Flask, url_for, request, redirect, render_templatefrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)app.config.from_object('config')db = SQLAlchemy(app)from app import models,views

2.创建app/models.py模块

上代码

from app import db #db是在app/__init__.py生成的关联后的SQLAlchemy实例class User(db.Model):    __tablename__ = 'users'    id = db.Column(db.Integer, primary_key=True)    username = db.Column(db.String(80), unique=True)    email = db.Column(db.String(320), unique=True)    password = db.Column(db.String(32), nullable=False)    def __repr__(self):        return '<User %r>' % self.usernameclass Admin(db.Model):    __tablename__ = 'admins'    id = db.Column(db.Integer, primary_key=True)    username = db.Column(db.String(80), unique=True)    email = db.Column(db.String(320), unique=True)    password = db.Column(db.String(32), nullable=False)    def __repr__(self):        return '<User %r>' % self.username

 3.创建create_db.py,表结构设计完成后执行python create_db.py即可完成表的创建,如下图

#app/create_db.py
from app import dbdb.create_all()


4.表已经创建完成了,接下来是我们的业务逻辑使用表的时候了

分别在user和admin蓝图中增加一个add用户的业务

#app/user.py

from flask import Blueprint, render_template, redirect,requestfrom app import dbfrom .models import Useruser = Blueprint('user',__name__)@user.route('/index')def index():    return render_template('user/index.html')@user.route('/add/',methods=['GET','POST'])def add():    if request.method == 'POST':        p_user = request.form.get('username',None)        p_email = request.form.get('email',None)        p_password = request.form.get('password',None)        if not p_user or not p_email or not p_password:            return 'input error'        newobj = User(username=p_user, email=p_email, password=p_password)        db.session.add(newobj)        db.session.commit()        users = User.query.all()        return render_template('user/add.html',users=users)    users = User.query.all()    return render_template('user/add.html',users=users)@user.route('/show')def show():    return 'user_show'

#app/admin.py

#admin.pyfrom flask import Blueprint,render_template, request, redirectfrom app import dbfrom .models import Adminadmin = Blueprint('admin',__name__)@admin.route('/index')def index():    return render_template('admin/index.html')@admin.route('/add/',methods=['POST','GET'])def add():    if request.method == 'POST':        p_admin = request.form.get('username',None)        p_email = request.form.get('email',None)        p_password = request.form.get('password',None)        if not p_admin or not p_email or not p_password:            return 'input error'        newobj = Admin(username=p_admin, email=p_email, password=p_password)        db.session.add(newobj)        db.session.commit()        admins = Admin.query.all()        return render_template('admin/add.html',admins=admins)    admins = Admin.query.all()    return render_template('admin/add.html',admins=admins)@admin.route('/show')def show():    return 'admin_show'

#app/templates/admin/add.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>AdminsAdd</title></head><body><form action="/admin/add/" method="POST">    user:<input type="text" name="username" />    email:<input type="text" name="email" />    pwd:<input type="password" name="password" />    <input type="submit" value="add" /></form>{% if admins %}<table border="1px">    <tr>        <th>UserName</th>        <th>Email</th>    </tr>    {% for u in admins %}        <tr>            <td>{{u.username}}</td>            <td>{{u.email}}</td>        </tr>    {% endfor %}</table>{% endif %}</body></html>

#app/templates/user/add.html

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>UserAdd</title></head><body><form action="/user/add/" method="POST">    user:<input type="text" name="username" />    email:<input type="text" name="email" />    pwd:<input type="password" name="password" />    <input type="submit" value="add" /></form>{% if users %}<table border="1px">    <tr>        <th>UserName</th>        <th>Email</th>    </tr>    {% for u in users %}        <tr>            <td>{{u.username}}</td>            <td>{{u.email}}</td>        </tr>    {% endfor %}</table>{% endif %}</body></html>


#app/views.py

from app import appfrom .admin import adminfrom .user import userapp.register_blueprint(admin,url_prefix='/admin')app.register_blueprint(user, url_prefix='/user')

#run.py

from app import appapp.run()

到这里也就结束了,这样这个例子就结合了蓝图和flask-sqlalchemy.本例中只使用了db.session.add(),其它的还有db.session.delete()...

看一下效果:

 localhost:5000/user/add

 

 localhost:5000/admin/add

 

 






0 0
原创粉丝点击