flask web 编程学习笔记4:SQL


Flask 支持多种数据库,并采用sqlalchemy 作为常用ORM,链接数据库也比较方便。
1. 复制执行下述代码,即可实现数据库的链接。
2. 用编辑器打开数据库文件,可以看到自己添加的数据内容。

'''
    Note4. SQL Database And Example
'''
#
#########################################################################
#
#     数据库按照一定规则保存程序数据,程序再发起查询取回所需
# 的数据。Web 程序最常用基于关系模型的数据库,这种数据库也称
# 为SQL 数据库,因为它们使用结构化查询语言。不过最近几年文档
# 数据库和键值对数据库成了流行的替代选择,这两种数据库合称
# NoSQL数据库。
# 
#########################################################################
#
# 1) Flask 可用MySQL、Postgres、SQLite、Redis、MongoDB或者CouchDB。
#    SQLAlchemy ORM 作为一个数据库工具,常被用于项目。
#
# 2) SQLAlchemy安装: pip install flask-sqlalchemy.
#
# 3) SQLAlchemy支持以下数据库,方法如下:
# |----------------------------------------------------------------------
# | 数据库            | 引擎URL
# |----------------------------------------------------------------------
# | MySQL             | mysql://username:password@hostname/database
# | Postgres          | postgresql://username:password@hostname/database
# | SQLite(Unix)    | sqlite:////absolute/path/to/database
# | SQLite(Windows) | sqlite:///c:/absolute/path/to/database
# |----------------------------------------------------------------------
# 
# 以下按照sqlite3 进行说明。
#
from flask import Flask,render_template, session, redirect, url_for
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.bootstrap import Bootstrap
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
import os

# 得到项目路径的常用方法。
basedir = os.path.abspath(os.path.dirname(__file__))

# Flask 实例化
app = Flask(__name__)
# 定义app数据库文件及路径。
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
# SQLALCHEMY_COMMIT_ON_TEARDOWN配置。
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
#
app.config['SECRET_KEY'] = 'hard to guess string'
# db 对象是SQLAlchemy 类的实例,表示程序使用的数据库,同时还获得了
# Flask-SQLAlchemy提供的所有功能。
db = SQLAlchemy(app)
#
bootstrap = Bootstrap(app)
#
#     采用类继承的方式定义新的数据库表格,类变量__tablename__ 定义在
# 数据库中使用的表名。Column函数定义表中元素,其参数特点如下:
#     db.Column(类型,其他参数,....)
#
# 1) 类型表.
# |-------------------------------------------------------------------------
# | 类型名       | Python类型          | 说  明
# |-------------------------------------------------------------------------
# | Integer      | int                 | 普通整数,一般是32 位
# | SmallInteger | int                 | 取值范围小的整数,一般是16 位
# | BigInteger   | int 或long          | 不限制精度的整数
# | Float        | float               | 浮点数
# | Numeric      | decimal.Decimal     | 定点数
# | String       | str                 | 变长字符串
# | Text         | str                 | 变长字符串,对较长或不限长度的字符串
# |------------------------------------| 做了优化
# | Unicode      | unicode             | 变长Unicode 字符串
# | UnicodeText  | unicode             | 变长Unicode 字符串,对较长或不限长度
# |------------------------------------| 的字符串做了优化
# | Boolean      | bool                | 布尔值
# | Date         | datetime.date       | 日期
# | Time         | datetime.time       | 时间
# | DateTime     | datetime.datetime   | 日期和时间
# | Interval     | datetime.timedelta  | 时间间隔
# | Enum         | str                 | 一组字符串
# | PickleType   | 任何Python          | 对象自动使用Pickle 序列化
# | LargeBinary  | str                 | 二进制文件
# |---------------------------------------------------------------------------
#
# 2) 其他属性表
# |---------------------------------------------------------------------------
# | 选项名      | 说  明
# |---------------------------------------------------------------------------
# | primary_key | 如果设为True,这列就是表的主键
# | unique      | 如果设为True,这列不允许出现重复的值
# | index       | 如果设为True,为这列创建索引,提升查询效率
# | nullable    | 如果设为True,这列允许使用空值;如果设为False,这列不允许使用
# |-------------| 空值
# | default     | 为这列定义默认值
# |---------------------------------------------------------------------------
#
class Role(db.Model):
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    #     db.relationship() 中的backref 参数向User 模型中添加一个role 属性,
    # 从而定义反向关系。这一属性可替代role_id 访问Role 模型,此时获取的是模
    # 型对象,而不是外键的值。
    users = db.relationship('User', backref='role')
    def __repr__(self):
        return '' % self.name
        
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    #     关系使用users 表中的外键连接了两行。添加到User 模型中的role_id 列
    # 被定义为外键,就是这个外键建立起了关系。传给db.ForeignKey() 的参数
    # 'roles.id' 表明,这列的值是roles 表中行的id 值。
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    def __repr__(self):
        return '' % self.username

class NameForm(Form):
    name = StringField('What is your name?', validators=[Required()])
    submit = SubmitField('Submit')
    
@app.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.name.data).first()
        if user is None:
            user = User(username = form.name.data)
            db.session.add(user)
            session['known'] = False
        else:
            session['known'] = True
        session['name'] = form.name.data
        form.name.data = ''
        return redirect(url_for('index'))
    return render_template('sql.html',\
                           form = form, name = session.get('name'),\
                           known = session.get('known', False))
if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)

版权所有丨如未注明,均为原创,转载请注明转自:https://whonee.net/flask-web-%e7%bc%96%e7%a8%8b%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b04%ef%bc%9asql.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注