《Flask Web开发》学习(五)——数据库(一)

1.SQL数据库

SQL数据库是基于关系的数据库。关系型数据库把数据存放在表中,表的列数是固定的,行数是可变的。列定义表所表示的实体的数据属性,行定义各列的真实数据。

表中有个特殊的列,称为主键,其值为表中各行的唯一标识符。表中还有称为外键的列,用来引用同一个表或不同表中某行的主键。这种联系称为关系。

关系型数据库存储数据很高效,而且避免了重复。但把数据存放在多个表中还是很复杂。关系型数据库引擎为联结操作提供了必要的支持。

2.NoSQL数据库

所有不遵循关系模型的数据库统称为NoSQL数据库。NoSQL数据库一般使用集合代替表,使用文档代替记录。这种设计方式使联结变得困难。反规范化操作得到的NoSQL数据库减少了表的数量,增加了数据重复量。但数据重复可以提升查询速度。

3.使用SQL还是 NoSQL

SQL数据库擅于用高效且紧凑的形式存储结构化数据,这种数据库需要花费大量精力保证数据的一致性。NoSQL数据库放宽了对这种一致性的要求,从而获得性能上的优势。

对中小程序来说,SQL和NoSQL都是很好的选择,性能相当。

4.Python数据库框架

Flask可以让你根据自己的喜好选择使用MySQL、Postgres、SQLite、Redis、MongoDB或者CouchDB。如果这些都无法满足需求,还有一些数据库抽象层代码包供选择,如SQLAlchemy和MongoEngine。这些抽象包可以直接处理高等级Python对象,而不用处理如表、文档或查询语言此类的数据库实体。

选择数据库框架时主要考虑易用性、性能、可移植性。数据库抽象层也称为对象关系映射(ORM)或对象文档映射(ODM),它在易用性上强于数据库引擎,在用户不知觉的情况下把高层的面向对象操作转换成低层的数据库指令。

但ORM和ODM把对象业务转换为数据库业务会有一定的损耗。但相比于它们对生产率的提升,这种性能的降低微不足道。

在可移植性上,SQLAlchemy ORM支持很多关系型数据库引擎。同时对于Flask集成度,选择集成了Flask的框架可以简化配置和操作。

5.使用Flask-SQLAlchemy

安装Flask-SQLAlchemy,在虚拟空间命令行下输入:

pip install flask-sqlalchemy

配置数据库

from flask_sqlalchemy import SQLAlchemy

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =\
    'sqlite:///' + os.path.join(basedir, 'data.sqlite')    #程序使用的数据库URL必须保存到flask配置对象的SQLALCHEMY_DATABASE_URI键中
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True    #将其设为True时,每次请求结束后都会自动提交数据库中的变动

db = SQLAlchemy(app)    #db是SQLAlchemy类的实例

6.定义模型

模型这个术语表示程序使用的持久化实体。在ORM中,模型一般是一个Python类,类中的属性对应数据库表中的列。

class Role(db.Model):    #定义Role模型
    __tablename__ = 'roles'    #定义在数据库中使用的表名
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    users = db.relationship('User', backref='role')

    def __repr__(self):
        return '<Role %r>' % self.name


class User(db.Model):    #定义User模型
    __tablename__ = 'users'    #定义在数据库中使用的表名
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return '<User %r>' % self.username

7.关系

关系型数据库使用关系把不同表中的行联系起来。

猜你喜欢

转载自blog.csdn.net/theShepherd/article/details/86654164