8. 数据库框架SQLAlchemy

首先扫个盲: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关系选项
这里写图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值