资讯专栏INFORMATION COLUMN

Flask扩展之flask-sqlalchemy(上)

KaltZK / 2755人阅读

摘要:查询记录在调试或测试模式自动启用。可以用于显式禁用原生支持。当使用不合适的指定无编码的数据库默认值时,这对于一些数据库适配器是必须的比如上某些版本的。这对是必要的,它默认移除闲置多于小时的连接。注意如果使用了,自动设定这个值为小时。

flask-sqlalchemy是flask的一个ORM扩展框架,这个扩展在sqlalchemy的进行的扩展,更方便的结合Flask.
什么是ORM?
其是Object Relational Mapping的缩写,中文:对象关系映射,说白了就是程序中的实体类通过ORM可以映射成为数据库中的表,方便我们通过程序的方式操作数据表,这里就包括数据表的生成删除关系创建及表记录的增删改查
【config.py】

SQLALCHEMY_DATABASE_URI="mysql://root:mysql@127.0.0.1:3306/test"    //数据库连接

SQLALCHEMY_TRACK_MODIFICATIONS=False

上面两项是必配置的属性,否则程序将不能正常运行:所有配置键见最后

【create_sur.py】

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

db = SQLAlchemy(app)
app.config.from_object("config.py")


class User(db.Model):
    __tablename__ = "user"    #指定表名,默认模型类小写
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(32))

    def __repr__(self):
        return "Role:%s" % self.name


if __name__ == "__main__":
    db.create_all()
    app.run()

这样子在test数据库下就生成了一张user表,是不是很简单。
在进行数据的增删改查之前,我们先来看一下常用的操作语句:

常见操作语句

db.session.add(obj) 添加对象

db.session.add_all([obj1,obj2,..]) 添加多个对象

db.session.delete(obj) 删除对象

db.session.commit() 提交会话

db.session.rollback() 回滚

db.session.remove() 移除会话

增加数据
>>>from create_sur import db,User
>>>user1=User(name="jim")
>>>db.session.add(user1)
>>>db.session.commit()    //添加一条数据
>>>user2=User(name="sam")
>>>user3=User(name="alice")
>>>db.session.add_all([user2,user3])    //批量添加数据
>>>db.session.commit()
查询数据
>>>from create_sur import db,User
>>>user_all=User.query.all()    //查询所有数据
>>>user=User.query.filter_by(name="jim").all()    //查询name为jim的数据
>>>user=User.query.filter(User.name="sam").first()    //查询name为sam的数据

常用过滤函数:

常用查询函数:

删除数据
//在查询数据的基础上
>>>db.session.delete(obj)    //obj为查询后的数据对象
>>>db.session.commit()
更新数据
//在查询数据的基础上通过修改对象的属性然后再添加达到更新的作用
>>>user=User.query.filter(User.name="sam").first()    //查询数据
>>>user.name="sam_two"
>>>db.session.add(user)
>>>db.session.commit()

上面是一些简单的小例子,接下来我们写一个有外键关系的两个表的例子:
【create_sur2.py】

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

db = SQLAlchemy(app)
app.config.from_object("config.py")

class Role(db.Model):
    # 定义表名
    __tablename__ = "roles"
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    #设置关系属性,方便查询使用
    us = db.relationship("User", backref="role")
    #重写__repr__方法,方便查看对象输出内容
    def __repr__(self):
        return "Role:%s"% self.name
        
class User(db.Model):
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    password = db.Column(db.String(64))
    role_id = db.Column(db.Integer, db.ForeignKey("roles.id"))    #定义外键

    def __repr__(self):
        return "User:%s"%self.name

上述有两个重点:

使用ForeignKey义外键属性

使用relationship方法定义两表的关系

接下来我们测试一下这两个方法的作用:

添加一些数据:
>>>from create_sur2 import db,User,Role
>>>ro1 = Role(name="admin")
>>>ro2 = Role(name="user")
>>>db.session.add_all([ro1,ro2])
>>>db.session.commit()
>>>us1 = User(name="wang", password="123456", role_id=ro1.id)
>>>us2 = User(name="zhang", password="201512", role_id=ro2.id)
>>>us3 = User(name="chen", password="987654", role_id=ro2.id)
>>>us4 = User(name="zhou", password="456789", role_id=ro1.id)
>>>db.session.add_all([us1,us2,us3,us4])
>>>db.session.commit()

测试一下查询:
>>>from create_sur2 import User,Role
>>>role=Role.query.get(1)
>>>role.User.all()
[User:wang,User:zhou]    这里之所以可以找到就是因为relationship通过外键作用实现的

>>>user=User.query.get(3)
>>>user.role
[Role:user]    这里之所以可以找到就是因为relationship的backref参数值实现的
所有配置清单

SQLALCHEMY_DATABASE_URI 用于连接的数据库 URI
SQLALCHEMY_BINDS 一个映射 binds 到连接 URI 的字典
SQLALCHEMY_ECHO 如果设置为Ture, SQLAlchemy 会记录所有 发给 stderr 的语句,这对调试有用。(打印sql语句)
SQLALCHEMY_RECORD_QUERIES 可以用于显式地禁用或启用查询记录。查询记录 在调试或测试模式自动启用。更多信息见get_debug_queries()。
SQLALCHEMY_NATIVE_UNICODE 可以用于显式禁用原生 unicode 支持。当使用 不合适的指定无编码的数据库默认值时,这对于 一些数据库适配器是必须的(比如 Ubuntu 上 某些版本的 PostgreSQL )。
SQLALCHEMY_POOL_SIZE 数据库连接池的大小。默认是引擎默认值(通常 是 5 )
SQLALCHEMY_POOL_TIMEOUT 设定连接池的连接超时时间。默认是 10 。
SQLALCHEMY_POOL_RECYCLE 多少秒后自动回收连接。这对 MySQL 是必要的, 它默认移除闲置多于 8 小时的连接。注意如果 使用了 MySQL , Flask-SQLALchemy 自动设定 这个值为 2 小时。

所有数据类型

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42881.html

相关文章

  • Flask扩展flask-migrate

    摘要:一个用来做数据迁移的扩展,一般都是结合使用,在上一篇文章中我也介绍了这个扩展,需要的小伙伴可以看一下,后续我会将更深层的写出来。 flask-migrate一个用来做数据迁移的falsk扩展,一般都是结合flask-sqlalchemy使用,在上一篇文章中我也介绍了这个扩展,需要的小伙伴可以看一下,后续我会将flask-sqlalchemy更深层的写出来。【config.py】 SQL...

    Snailclimb 评论0 收藏0
  • Flask Web Development —— 数据库(

    摘要:数据库关系数据库将数据保存在表中来模拟应用程序中不同的实体。这些行之间的连接称作关系,也是关系数据库模型的基础。就像这个示例中看到的那样,关系数据库存储数据高效且避免重复。最好的例子就是,支持一组关系数据库引擎,包括流行的和。 数据库就是有组织的存储应用程序数据,然后查询检索指定需要的那部分。大部分web应用程序都采用基于关系模型的数据库,也称作结构化查询语言(SQL)数据库。但是最近...

    skinner 评论0 收藏0
  • Flask Web Development —— 数据库(

    摘要:数据库关系数据库将数据保存在表中来模拟应用程序中不同的实体。这些行之间的连接称作关系,也是关系数据库模型的基础。就像这个示例中看到的那样,关系数据库存储数据高效且避免重复。最好的例子就是,支持一组关系数据库引擎,包括流行的和。 数据库就是有组织的存储应用程序数据,然后查询检索指定需要的那部分。大部分web应用程序都采用基于关系模型的数据库,也称作结构化查询语言(SQL)数据库。但是最近...

    rockswang 评论0 收藏0
  • Flask 插件系列 - Flask-SQLAlchemy

    摘要:程序中最常用的莫过于关系型数据库了,也称数据库。对象是类的实例,表示程序使用的数据库。本文由发表于个人博客,采用自由转载保持署名非商用禁止演绎协议发布。非商业转载请注明作者及出处。本文标题为插件系列本文链接为更多阅读 简介 Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据...

    LoftySoul 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<