首先扫个盲:SQL是结构化查询语言(Structured Query Language)三个单词的首字母缩写。
数据库就是按照一定规则保存的程序数据,程序发起查询可以取回查询到的数据。Web程序最常用基于关系模型的数据库,这种数据库也称为SQL数据库。
关系型数据库把数据存储在表中,表模拟程序中不同的实体。表的列数是固定的,行数是可变的。列定义表所表示的实体的数据属性。如,customers表中可能有name、address、phone等列。表中的行定义各列对应的真实数据。
表中有个特殊的列,称为主键,其值为表中各行的唯一标识符。表中还可以有成为外键的列,引用同一个表或不同表中某行的主键。行之间的这种联系称为关系(relationships),这是关系型数据库模型的基础。
不遵循关系型模型的数据库统称为NoSQL(Not only SQL)数据库,一般使用集合代替表,使用文档代替记录。NoSQL数据库采用的设计方式使联结(什么鬼?)变得困难,所以大多数数据库根本不支持这种操作。NoSQL数据库擅于用高效且紧凑的形式存储结构化数据,与关系型数据库相比,它减少了表的数量,但是增加了数据的重复量。
这本教程中选用的是Flask-SQLAlchemy数据库框架,它支持很多关系型的数据库引擎,包括流行的MySQL、Postgres、SQLite。
像之前一样,用pip安装:
pip install flask-sqlalchemy
在SQLAlchemy中,数据库使用URL指定。这里用的是SQLite,相应的URL为:
(UNIX) sqlite:///absolute/path/to/database
( Windows) sqlite:///c:/absolute/path/to/database
其中,database表示要使用的数据库名。SQLite不需要使用服务器,因此不用指定hostname、username和password,URL中的database是硬盘上文件的文件名。
程序使用的数据库URL必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI键中。配置对象中还有一个很有用的选项,即SQLALCHEMY_COMMIT_ON_TEARDOWN键,将其设为True时,每次请求结束后都会自动提交数据库中的变动。下面的代码展示了如何初始化及配置一个简单的SQLite数据库:
hello.py 配置数据库
from flask.ext.sqlalchemy import SQLAlchemy # 导入扩展模块
basedir = os.path.abspath(os.path.dirname(__file__)) # 获取当前路径,用于后面指定数据库文件路径
app = Flask(__name__) # 创建Flask类实例
app.config['SQLALCHEMY_DATABASE_URI'] =\
'sqlite:.///' + os.path.join(basedir, 'data.sqlite') # 配置数据库URL到SQLALCHEMY_DATABASE_URI键中
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True # 配置*键,使每次请求结束后自动提交数据库中的变动
db = SQLAlchemy(app) # SQLAlchemy类的实例,表示程序使用的数据库,同时获得了Flask-SQLAlchemy提供的所有功能。
继续,在hello.py 中定义模型:
class Role(db.Model):
__tablename__ = 'roles' # 定义数据库中使用的表名
id = db.Column(db.Integer, primary_key=True) # 模型属性,被定义为db.Column类的实例
name = db.Column(db.String(64), unique=True) # 模型属性,uinque=True表示这一列不允许出现重复的值
def __repr__(self): # 定义__repr__()方法,返回一个具有可读性的字符串表示的模型,可在调试和测试时使用
return '<Role %r>' % self.name
users = db.relationship('User', backref='role') # 表示两个模型间的关系,backref定义反向关系
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True) # index=True表示为这列创建索引,提升查询效率
def __repr__(self):
return '<User %r>' % self.username
role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) # 定义外键,说明该列的值是roles表中行的id值
补充:
1、 Flask-SQLAlchemy数据库URL
2、 最常用的SQLAlchemy列类型
3、 最常用的SQLAlchemy列选项
4、 常用的SQLAlchemy关系选项