
SQLAlchemy 是一个功能强大的 ORM 。 Flask-SQLAlchemy 是一个 Flask 插件,它让我们在 Flask 框架中使用 SQLAlchemy 变得更容易。
本篇介绍我在使用 Flask-SQLAlchemy 21 时进行联表查询的一些经验
这里有两个表,account 表保存帐号 ID 和昵称,bind 表保存 account 之间的绑定关系。
对应的 Model 如下:
先来看一个简单的例子:查询 gameuid 1000 账号下绑定的所有帐号。
看一看生成的 SQL 语句:
这里的联表查询使用的是 WHERE 语句。如果希望使用 JOIN 语句,可以这样写:
可以看出,现在生成的 SQL 语句已经使用 JOIN 语句了。但上面的语意有点奇怪,既然已经在 query 中使用了 Bind 和 Account,后面再 join 一次 Account 总觉得有点多余。那么 SQLAlchemy 如何选择 JOIN 的时候谁先谁后呢?看看这个错误就知道了:
这个错误显然说明,query 中参数的顺序很重要,第一个参数所代表的 table 就是 JOIN 时放在前面的那个 table。因此,此处 JOIN 的目标应该是 Account, 而不应该是 Bind 自身。
上面的例子已经解决了大多数需求了。我们再来看看分页。在 Flask-SQLAlchemy 中封装了一个 paginate 方法,可以方便地将查询记录进行分页:
报错的原因是 dbsessionquery 默认返回的是 ormQuery 对象,这个对象并不包含 paginate 方法。要解决这个问题,需要修改 Flask-SQLAlchemy 的源码。
找到 SQLAlchemy 对象的 __init__ 定义,在其中加入 session_options['query_cls'] = BaseQuery 即可:
在 Flask-SQLAlchemy 提供的 Model 对象中,可以使用 Modelquery 这样的语法来直接得到一个查询对象,这是由于 Flask-SQLAlchemy 中存在一个 _QueryProperty 类,每次调用 Model__get__ 时,会自动生成一个基于当前 session 的 query 对象:
使用 Modelquery 得到的这个 query 对象可以直接进行 JOIN *** 作,得到的结果是 Model 对象。这样就方便多了:
转换成 SQL 是这样的:
可以看出,这样的查询结果和使用 dbsessionquery 并没有什么不同。由于返回的是 Model 对象,使用上可能还更加方便了。
如何使用 Modelqueryjoin 语法得到部分字段呢?这里可以使用 SQLAlchemy 提供的 with_entities 方法:
注意,列表中的项 (2, '玩家10001') 并不是标准的 Python tuple。你如果查看它的类型,会发现一个奇怪的名称: <class 'sqlalchemyutil_collectionsresult'> 。它是一个 AbstractKeyedTuple 对象,拥有一个 keys() 方法,这样可以很容易将其转换成 dict :
想了解 AbstractKeyedTuple ,可以看看这篇文档 New KeyedTuple implementation dramatically faster 。
除了筛选字段外,还可以用另一个方法获取多个 Model 的记录。那就是,返回两个 Model 的所有字段:
使用上面的语法直接返回 Account 和 Bind 对象,可以进行更加灵活的 *** 作。
要联结超过 2 张以上的表,可以直接在 join 得到的结果之后链式调用 join 。也可以在 filter 的结果后面链式调用 join 。join 和 filter 返回的都是 query 对象,因此可以无限链式调用下去。
写完查询后,应该打印生成的 SQL 语句查看一下有没有性能问题。
MHA监控复制架构的主服务器,一旦检测到主服务器故障,就会自动进行故障转移。即使有些从服务器没有收到最新的relay log,MHA自动从最新的从服务器上识别差异的relay log并把这些日志应用到其他从服务器上,因此所有的从服务器保持一致性了。MHA通常在几秒内完成故障转移,9-12秒可以检测出主服务器故障,7-10秒内关闭故障的主服务器以避免脑裂,几秒中内应用差异的relay log到新的主服务器上,整个过程可以在10-30s内完成。还可以设置优先级指定其中的一台slave作为master的候选人。由于MHA在slaves之间修复一致性,因此可以将任何slave变成新的master,而不会发生一致性的问题,从而导致复制失败。
2 交互式主服务器故障转移
可以只使用MHA的故障转移,而不用于监控主服务器,当主服务器故障时,人工调用MHA来进行故障故障。
3 非交互式的主故障转移
不监控主服务器,但自动实现故障转移。这种特征适用于已经使用其他软件来监控主服务器状态,比如heartbeat来检测主服务器故障和虚拟IP地址接管,可以使用MHA来实现故障转移和slave服务器晋级为master服务器。
4 在线切换主从服务器
在许多情况下,需要将现有的主服务器迁移到另外一台服务器上。比如主服务器硬件故障,RAID控制卡需要重建,将主服务器移到性能更好的服务器上等等。维护主服务器引起性能下降,导致停机时间至少无法写入数据。另外,阻塞或杀掉当前运行的会话会导致主主之间数据不一致的问题发生。MHA提供快速切换和优雅的阻塞写入,这个切换过程只需要05-2s的时间,这段时间内数据是无法写入的。在很多情况下,05-2s的阻塞写入是可以接受的。因此切换主服务器不需要计划分配维护时间窗口(呵呵,不需要你在夜黑风高时通宵达旦完成切换主服务器的任务)。
5MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)
要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,管理节点可以和master在一台机器上。所以如果你只有二台机器的话,heartbeat,keepalive等都是不错的选择了。
6MHA比较灵活,可以写脚本,来进行故障转移,或者主从切换等。
在configpy中加入以下两项配置:
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxxxx@localhost:3306/testcharset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = True
就会自动完成连接的测试,如果失败就会抛出异常
用 Flask-SQLAlchemy(SQLAlchemy ORM 模块的 Flask 定制版)。这个在定义 schema、连接数据库、增删改查方面都给你提供极大的便利。
这个对象就包含 sqlalchemy 和 sqlalchemyorm 中的所有函数和助手。此外它还提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类:
from flask import Flask
from flaskextsqlalchemy import SQLAlchemy
app = Flask(__name__)
appconfig['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/testdb'
db = SQLAlchemy(app)
class User(dbModel):
id = dbColumn(dbInteger, primary_key=True)
username = dbColumn(dbString(80), unique=True)
email = dbColumn(dbString(120), unique=True)
def __init__(self, username, email):
selfusername = username
selfemail = email
def __repr__(self):
return '<User %r>' % selfusername
当然可以自己写代码连接到数据库,并 *** 作之。
使用Sqlalchmy的目的主要是ROM吧。工作重心可以放在业务处理上,而不用太 *** 心数据库的具体 *** 作和sql语法,特别是多表的join~
Flask的文档里,就有说怎么直接通过Python *** 作数据库的内容。
1、批处理脚本中,要想与用户实行交互,需要用到命令set 配合/p参数一起使用。
2、set命令是用来定义变量并赋值的,而使用/p参数后,set 并不马上在命令中给变量赋值,而是另起一行,等待用户的输入,并用户的输入内容做为值赋给变量。
3、而且在set /p后,可以加入提示语句,让用户知道,程序正在等待输入。
4、与用户交互,虽然已经实现了用户输入的接收。但还需要对接收到的内容进行处理,这时可以利用if 语句来完成。
5、运行后的效果如下,用户输入admin时,显示“输入正确”,否则,显示“请输入正确的用户名”。
6、再来完善一下脚本代码,做一个简单的用户登录判断。主要用到goto语句和if语句,实现python写网页后台实现与数据库交互。
以上就是关于在 Flask-SQLAlchemy 中联表查询全部的内容,包括:在 Flask-SQLAlchemy 中联表查询、在python3下怎样用flask-sqlalchemy对mysql数据库 *** 作、flask-sqlachemy在连接mysql 前,怎么验证连接池连接是否有效等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)