Python的Flask框架中使用Flask

利用Flask-SQLAlchemy管理数据库 Flask-SQLAlchemy是二个Flask扩张,它简化了在Flask应用程序中对SQLAlchemy的采用。SQLAlchemy是二个强硬的关周到据库框架,帮衬部分数据库后端。提供高等的ORM和尾巴部分访问数据库的地点SQL功效。
和任何扩大相仿,通过pip安装Flask-SQLAlchemy:

(venv) $ pip install flask-sqlalchemy

在Flask-SQLAlchemy,数据库被内定为ULacrosseL。表格列出七个最受招待的数据库引擎url的格式:

图片 1

在那一个UPAJEROL中,hostname是指托管MySQL服务的服务器,或然是本地(localhost)又大概远程服务器。数据库服务器能够托管多少个数据库,所以database提议要利用的多寡库名。数据库须要身份验证,username和
password是数据库顾客凭证。
注:>
SQLite数据库未有劳动,所以hostname、username和password能够缺省且数据库是多少个磁盘文件名。
应用程序数据库U大切诺基L必须在Flask配置对象中的SQLALCHEMY_DATABASE_UHighlanderI键中开展示公布局。另三个使得的取舍是SQLALCHEMY_COMMIT_ON_TEA奥迪Q7DOWN,能够设置为True来启用自动提交数据库校订在各样央浼中。查阅Flask-SQLAlchemy文书档案获取愈来愈多别的安排选项。

from flask.ext.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')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True

db = SQLAlchemy(app)

由SQLAlchemy实例化的db对象表示数据库且提供访谈Flask-SQLAlchemy的兼具效率。

模型定义 模型是指由应用程序使用的长久化实体。在ORM的背景下,二个模子日常是三个包涵属性的Python类,其品质与数据库表的列相配成对应。Flask-SQLAlchemy数据库实例提供了八个基类以至风华正茂组帮助类和函数用于定义它的协会。

class Role(db.Model):
  __tablename__ = 'roles'
  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

__tablename__类变量定义数据库中表的名目。假设__tablename__缺省Flask-SQLAlchemy会钦命暗许的表名,可是那几个缺省名称不遵从使用复数命名的约定,所以最佳是显式命名表名。其他的变量是模型的性质,被定义为db.Column类的实例。
传给db.Column布局函数的率先个参数是数据库列的门类也正是模型属性的数据类型。表格5-2列出大器晚成部分可用的列的品种,也是用于模型中的Python类型。

图片 2

最分布的SQLAlchemy列类型 db.Column剩余的参数为各种属性钦赐了配备选项。

图片 3

最常见的SQLAlchemy列选项 注:Flask-SQLAlchemy供给给持有的模型定义主键列,经常命名称为id。
四个模型都包含了repr(State of Qatar方法来给它们展现几个可读字符串,即便不是完全须要,不过用于调节和测验和测验依然很正确的。

关系 关周详据库通过应用关系在区别的表中国建工业总集结团立连接。关系图表达了客商和顾客剧中人物里面的简约关联。这么些剧中人物和客户是生龙活虎对多涉及,因为三个剧中人物能够附归于多个客商,而五个客商只好具备三个角色。
上边包车型客车模型类呈现了中表述的风华正茂对多关系。

class Role(db.Model): 
  # ...
  users = db.relationship('User', backref='role')

class User(db.Model): 
  # ...
  role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

事关通过动用外键来连接两行。加多给User模型的role_id列被定义为外键,且组建关联。db.ForeignKey(卡塔尔国的参数roles.id钦赐的列应该知道为在roles表的行中持有id值的列。
累积到Role模型的users属性表现了关联的面向对象的视角。给定Role类的实例,users属性会回去意气风发组连接到该剧中人物的顾客。内定给db.relationship(卡塔尔国的率先个参数申明模型中涉及的另一头。倘使类尚未定义,那么些模型能够用作字符串提供。
小心:在此以前在segmentdefault中相见的主题材料,后来轻易阅读了SQLAlchemy的源码。ForeignKey类的column选拔二种档期的顺序的参数,风姿浪漫种是“模型名.属性名”;风流倜傥种是“表名.列名”,最后生龙活虎种没看掌握,后一次试着用一下。
db.relationship(卡塔尔(قطر‎的backref参数通过给User模型扩充role属性来定义反向关系。那个性子可以代替role_id访谈Role模型,是作为指标实际不是外键。
大好些个情状下db.relationship(卡塔尔能够一定自身的外键关系,可是不时无法确定哪些列被充当外键。譬喻,假使User模型有七个或越来越多列被定义为Role的外键,SQLAlchemy将不知情使用两个中的哪一个。每当外键配置左顾右盼的时候,就非得运用额外参数db.relationship(卡塔尔。下标列出一些常用配置选项用于定义关系:

常用SQLAlchemy关系选项

图片 4

建议:假设你有克隆在GitHub上的应用程序,你现在得以运行git checkout
5a来切换来那些版本的应用程序。
除此而外大器晚成对多涉及还会有别的种类涉及。豆蔻梢头对风度翩翩关联得以公布为眼下描述的少年老成对多涉及,只要将db.relationship(State of Qatar中的uselist选项设置为False,“多”就产生“风姿浪漫”了。多对意气风发涉嫌也可代表为将表反转后的风度翩翩对多关系,或意味着为外键和db.relationship(卡塔尔(قطر‎定义在“多”那边。最复杂的涉及项目,多对多,须要三个被称作关联表的额外表。你就要第十四章学习多对多涉及。

数据库操作 读书怎么利用模型的最棒措施正是利用Python
shell。以下一些将介绍最多如牛毛的数据库操作。

创建表

第大器晚成要做的第生机勃勃件专业正是提示Flask-SQLAlchemy基于模型类创立数据库。db.create_all(State of Qatar函数会达成那一个:

(venv) $ python hello.py shell 
>>> from hello import db
>>> db.create_all()

尽管您检查应用程序目录,你会开采名称为data.sqlite的新文件,SQLite数据库名在布署中付出。假设数据库已存在db.create_all(卡塔尔(قطر‎函数不会再也创设或更新数据库表。那会极度的不实惠当模型被改正且变动须要使用到存活的数据库时。更新现存的数码库表的蛮力技术方案是先删除旧的表:

>>> db.drop_all()
>>> db.create_all()

倒霉的是,这种艺术有个不受款待的副效率便是灭绝旧的数据库中的全体数据。更新数据库难题的减轻方案会在此章快停止的时候介绍。

插入行

下边包车型地铁示例会创造新的剧中人物和客户:

>>> 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)

模型的构造函数接受模型属性的起头值作为主要字参数。注意,甚至足以行使role属性,就算它不是叁个实在的数量库列,而是生机勃勃对多涉及的高等代表。那几个新目的的id属性未有显式设置:主键由Flask-SQLAlchemy来管理。到近期截至对象只存于Python中,他们还没曾被写入数据库。因为她们的id值还没有分配:

>>> print(admin_role.id) None
>>> print(mod_role.id) None
>>> print(user_role.id) None

改正数据库的操作由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(State of Qatar方法来交付会话:

>>> db.session.commit()

重复检查id属性;那时候它们都曾经棉被服装置好了:

>>> print(admin_role.id) 
1
>>> print(mod_role.id)
2
>>> print(user_role.id) 
3

注:db.session数据库会话和第四章研讨的Flask会话未有别的关联。数据库会话也叫职业。
数据库会话在数据库生机勃勃致性上是十分常有效的。提交操作会原子性地将富有增添到会话中的对象写入数据库。假诺在写入的历程产生错误,会将整个会话废弃。要是你总是在多个对话提交有关校正,你必得保障制止因部分更新引致的数据库不周边的境况。

注:数据库会话也能够回滚。要是调用db.session.rollback(卡塔尔(قطر‎,任何增加到数据库会话中的对象都会重振旗鼓到它们已经在数据库中的状态。
修改行

数据库会话中的add(卡塔尔方法相仿能够用于创新模型。继续在同风流倜傥shell会话中,下边包车型大巴亲自去做重命名“Admin”剧中人物为“Administrator”:

>>> admin_role.name = 'Administrator'
>>> db.session.add(admin_role)
>>> db.session.commit()

在乎:然而貌似大家在做创新操作的时候都不应用db.session.add(State of Qatar,而是径直利用db.session.commit(卡塔尔(قطر‎来交付业务。
删除行

数据库会话同样有delete(卡塔尔方法。上面包车型客车示范从数据库中删除“Moderator”剧中人物:

>>> db.session.delete(mod_role)
>>> db.session.commit()

小心删除,和插入更新同样,都是在数据库会话提交后施行。

返回行

Flask-SQLAlchemy为每一个模型类创制一个query对象。最基本的询问模型是回来对应的表的全体内容:

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

动用过滤器能够配备查询对象去实施更具体的数据库寻觅。上面包车型大巴例子查找全数被分配“User”剧中人物的客户:

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

对于给定的查询还是能够检查SQLAlchemy生成的原生SQL查询,并将查询对象转换为二个字符串:

>>> 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'

即使您退出shell会话,在后面包车型大巴示范中开创的指标将不能够当作Python对象而留存,但可世袭作为行记录存在个别的数据库表中。若是你以前一个崭新的shell会话,你必须要从它们的多寡库行中重新创立Python对象。上边包车型地铁示范施行查询来加载名叫“User”的客户角色。

>>> user_role = Role.query.filter_by(name='User').first()

过滤器如filter_by(卡塔尔(قطر‎通过query对象来调用,且重临经过提炼后的query。多少个过滤器能够依次调用直到必要的查询配置甘休截至。

下边体现一些询问中常用的过滤器。

图片 5

在急需的过滤器已经全副用到于query后,调用all(卡塔尔会触发query执行并重回生龙活虎组结果,然而除外all(State of Qatar以外还应该有其余措施能够触发实施。常用SQLAlchemy查询实行器:

图片 6

涉及的规律相仿于查询。下边包车型客车亲自去做从两侧询问角色和客户之间的风流倜傥对多关系:

>>> users = user_role.users
>>> users
[<User u'susan'>, <User u'david'>]
>>> users[0].role
<Role u'User'>

此处的user_role.users查询有一些不是难点。当user_role.users表明式在内部调用all(State of Qatar时经过隐式查询实行来回到顾客的列表。因为查询对象是躲藏的,是不恐怕因此附加查询过滤器进一层提收取来。在此个一定的例证中,它恐怕是用以按字母排列顺序再次回到客商列表。在下边包车型客车以身作则中,被lazy
= ‘dynamic’参数改过过的关联布署的查询是不会自行施行的。

app/models.py:动态关系

class Role(db.Model): 
  # ...
  users = db.relationship('User', backref='role', lazy='dynamic') 
  # ...

用这种方法布置关系,user_roles.user查询还从未履行,所以能够给它扩张过滤器:

>>> user_role.users.order_by(User.username).all()
[<User u'david'>, <User u'susan'>]
>>> user_role.users.count()
2

你可能感兴趣的稿子:

  • 在Python程序和Flask框架中应用SQLAlchemy的科目
  • Python利用flask
    sqlalchemy完毕分页效果
  • Python的Flask框架中SQLAlchemy使用时的乱码难点一下子就解决了
  • 在Python的Flask框架下利用sqlalchemy库的归纳教程
  • Python的Flask框架与数据库连接的学科
  • Python的Flask框架中动用Flask-Migrate扩大迁移数据库的教程
  • Python框架Flask的中央数据库操作方法解析
  • Python使用Flask-SQLAlchemy连接数据库操作示例

Leave a Comment.