FlaskWeb开发学习小结-Flask-SQLAlchemy

FlaskWeb开发学习小结

使用Flask-SQLAlchemy管理数据库

1.配置一个SQLite数据库

basedir = os.path.abspath(os.path.dirname(__file__)) # 当前文件执行路径
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =\
 'sqlite:///' + os.path.join(basedir, 'data.sqlite') # sqlite的URL
# SQLALCHEMY_COMMIT_ON_TEARDOWN设为 True时,每次请求结束后都会自动提交数据库中的变动。
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# db 对象是 SQLAlchemy 类的实例表示程序使用的数据库,同时还获得了 Flask-SQLAlchemy提供的所有功能。
db = SQLAlchemy(app) 

注意:不同数据库引擎,URL格式不同

数据库引擎URL
MySQLmysql://username:password@hostname/database
Postgrespostgresql://username:password@hostname/database
SQLite(Unix)sqlite:absolute/path/to/database
SQLite(Windows)sqlite:///c:/absolute/path/to/database

2.定义模型(模型一般是一个 Python 类,类中 的属性对应数据库表中的列。 )

Flask-SQLAlchemy要求每个模型都要定义主键,这一列经常命名为id

class Role(db.Model):
 __tablename__ = 'roles' # 类变量 __tablename__ 定义数据库使用的表名
 # db.Column 类构造函数的第一个参数是数据库列和模型属性的类型。
 # db.Column 类构造函数的其余参数为列选项
 id = db.Column(db.Integer, primary_key=True)
 name = db.Column(db.String(64), unique=True)
 # 返回一个具有可读性的字符串表示模型,可在调试和测试时使用(非强制要编写)
 def __repr__(self):
 return '<Role %r>' % 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)
 def __repr__(self):
 return '<User %r>' % self.username
  • 常用的SQLAlchemy列选项
选项名说明
primary_key如果设为 True,这列就是表的主键
unique如果设为 True,这列不允许出现重复的值
index如果设为 True,为这列创建索引,提升查询效率
nullable如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值
default为这列定义默认值

3.建立模型间的关系

角色到用户的一对多关系 ,一个角色可属于多个用户,每个用户都只能有一个角色

class Role(db.Model):
 # ...
 # 对于一个 Role 类的实例,其 users 属性将返回与角色相关联的用户组成的列   #  表。db.relationship() 的第一个参数表明这个关系的另一端是哪个模型
 # backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系
 users = db.relationship('User', backref='role')
class User(db.Model):
 # ...
 # role_id被定义为users表的外键,与roles表建立关系
 # db.ForeignKey()的参数'roles.id'是roles表中行的id值
 role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

一对一关系可以用前面介绍的一对多关系 表示,但调用 db.relationship() 时要把 uselist 设为 False (如果设为 False,不使用列表,而使用标量值 )。多对多关系需要用到关系表,在后续章节才有介绍。

在Python shell中操作数据库

  1. 创建表

    >>> python hello.py shell
    >>> from hello import db
    >>> db.create_all()
  2. 插入行

    创建了一些角色和用户 :

    模型的构造函数接受的参数是使用关键字参数指定的模型属性初始值。注意,role 属性也可使用,虽然它不是真正的数据库列,但却是一对多关系的高级表示。 主键id由 Flask-SQLAlchemy 管理,现在这些对象只存在于 Python 中,还未写入数据库,因此 id 尚未赋值 。

    >>> from hello import Role, User
    >>> admin_role = Role(name='Admin')
    >>> mod_role = Role(name='Moderator')
    >>> user_role = Role(name='User')
    >>> user_john = User(username='john', role=admin_role)
    >>> user_susan = User(username='susan', role=user_role)
    >>> user_david = User(username='david', role=user_role)

    在 Flask-SQLAlchemy 中,数据库所做的改动通过数据库会话管理 ,会话用 db.session 表示 。准备把对象写入数据库之前,先要将其添加到会话中:

    >>> db.session.add(admin_role)
    >>> db.session.add(mod_role)
    >>> db.session.add(user_role)
    >>> db.session.add(user_john)
    >>> db.session.add(user_susan)
    >>> db.session.add(user_david)
    或者
    >>> db.session.add_all([admin_role, mod_role, user_role,
    ... user_john, user_susan, user_david])

    调用 commit() 方法提交会话 ,把对象写入数据库 :

    >>> db.session.commit()

    提交后,主键id会自动生成。

    调用 db.session.rollback() ,数据库会话可以回滚 。

  3. 修改行

    把 “Admin” 角色重命名为 “Administrator”:

    >>> admin_role.name = 'Administrator'
    >>> db.session.add(admin_role)
    >>> db.session.commit()
  4. 删除行

    把 “Moderator” 角色从数据库中删除:

    >>> db.session.delete(mod_role)
    >>> db.session.commit()
  5. 查询行

    Flask-SQLAlchemy 为每个模型类都提供了 query 对象。最基本的模型查询是取回对应表中 的所有记录:

    >>> Role.query.all()
    [<Role u'Administrator'>, <Role u'User'>]
    >>> User.query.all()
    [<User u'john'>, <User u'susan'>, <User u'david'>]

    使用过滤器可以配置 query 对象进行更精确的数据库查询。下面这个例子查找角色为 “User” 的所有用户:

    >>> User.query.filter_by(role=user_role).all()
    [<User u'susan'>, <User u'david'>]

    若要查看 SQLAlchemy 为查询生成的原生 SQL 查询语句,只需把 query 对象转换成字符串:

    >>> str(User.query.filter_by(role=user_role))
    'SELECT users.id AS users_id, users.username AS users_username,
    users.role_id AS users_role_id FROM users WHERE :param_1 = users.role_id'

    前面这些例子中创建的对象就不会以 Python 对象的形式存在,而 是作为各自数据库表中的行。如果你打开了一个新的 shell 会话,就要从数据库中读取行, 再重新创建 Python 对象。 下面这个例子发起了一个查询,加载名为 “User” 的用户角色:

    >>> user_role = Role.query.filter_by(name='User').first()
    • 常用的SQLAlchemy查询过滤器
过滤器说明
filter()把过滤器添加到原查询上,返回一个新查询
filter_by()把等值过滤器添加到原查询上,返回一个新查询
limit()使用指定的值限制原查询返回的结果数量,返回一个新查询
offset()偏移原查询返回的结果,返回一个新查询
order_by()根据指定条件对原查询结果进行排序,返回一个新查询
group_by()根据指定条件对原查询结果进行分组,返回一个新查询

在查询上应用指定的过滤器后,通过调用 all() 执行查询,以列表的形式返回结果。除了 all() 之外,还有其他方法能触发查询执行。

  • 最常使用的SQLAlchemy查询执行函数
方法说明
all()以列表形式返回查询的所有结果
first()返回查询的第一个结果,如果没有结果,则返回 None
first_or_404()返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应
get()返回指定主键对应的行,如果没有对应的行,则返回 None
get_or_404()返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误响应
count()返回查询结果的数量
paginate()返回一个 Paginate 对象,它包含指定范围内的结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值