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)