热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

flask+mako+peewee(下)(解决了Error2006:MySQLserverhasgoneaway)

这篇主要介绍在这次项目中使用的peewee文档地址:首先我们要初始化一个数据库连接对象。这里我使用了peewee提供的链接池。当然你也可以直接指定连接例如:

这篇主要介绍在这次项目中使用的peewee

文档地址:

首先我们要初始化一个数据库连接对象。这里我使用了peewee提供的链接池。当然你也可以直接指定连接例如:

db = SqliteDatabase('base.db')

我这里使用了peewee扩展pool,并初始化db对象参数。

from playhouse import pool
db = pool.PooledMySQLDatabase(host=conf['host'],
port=conf['port'],
user=conf['user'],
passwd=conf['passwd'],
database=conf['database'],
charset=conf['charset'],
stale_timeout=conf['timeout'],
max_cOnnections=conf['max_connections'])

然后建一个peewee的基类

#建议自己的项目使用一个新的基类,Model是peewee的基类
class BaseModel(Model):
class Meta:
database = db
@classmethod
def getOne(cls, *query, **kwargs):
#为了方便使用,新增此接口,查询不到返回None,而不抛出异常
try:
return cls.get(*query,**kwargs)
except DoesNotExist:
return None

然后就可以使用类继承BaseModel建立表了

class XcfRootCategory(BaseModel):
class Meta:
db_table = 'xcf_root_category'
xcf_category_id = IntegerField() # 下厨房十九宫格一级分类ID
name = CharField(null=False)

这里觉得值得一讲的只有特殊的Meta,Peewee文档里面提供了非常多的Meta类型可以使用。这里的意思是指定了db_table是在数据库里名叫xcf_root_category的表然后对应起来,这个类下面的方法,操作的其实就是对应的xcf_root_category这张表的内容。类的实例也就是这张表的实例。

其他参数可以查询文档得到不赘述。

之后我尝试给这张表添加一些方法

@classmethod
def update_name(cls, xcf_category_id, name):
try:
XcfRootCategory.update(name=name).where(XcfRootCategory.xcf_category_id == xcf_category_id).execute()
return True
except:
return False

这是官方推荐的写法。虽然有点奇怪,但是据说效率不错。

这里的语句更新了一条记录

其他也没有遇到什么坑,唯一可能会比较让人头痛的就是peewee在对mysql进行连接发生著名的ERROR2006的问题,

Error 2006: MySQL server has gone away

这里其实官方介绍了两种方法解决,在2016年1月17号的时候,同样遇到该问题的朋友还向官方发了一个修复的pr现在已经合并,估计下次发版会修复

地址:https://github.com/coleifer/peewee/pull/822

着重讲一下这个pr到底是修复了什么问题呢?

在这个issue被修复之前,如果你使用peewee连接会很容易发现,当你在发起了一次request操作之后,一段时间不操作,正好你的数据库的wait_timeout超时时间又设置得比较短,那么在你下次请求的时候就会出现Error 2006: mysql server has gone away的错误。即使你按照官方文档使用了钩子或者更细粒度的线程管理,也无法阻止这个问题。因为代码本身有个bug,就是无法正确的判断连接是不是已经断掉了。也就是说当mysql到达了超时的时间,但是peewee的连接管理并不知道这个情况,由于peewee在请求第一次之后就是一直维持连接是打开的状态,所以当你试图继续使用这个连接发起sql操作的时候,连接实际上被关闭了,然后就报错了。在现在github上的2.80版本已经修复了该问题,可以正确判断和mysql的连接是否已经断开,所以再结合官方的方法,将不会再出现无法知晓数据库连接是否已经断开的问题。

我这次使用的是结合框架的显示打开关闭连接避免这个问题。

其实官方文档提供了两种方法,一种是基于框架的,使用request hooks解决,基本原理就是在开启一次请求的时候,在开启前用钩子函数手动显示的的打开

数据库连接,然后在结束请求的时候显示指明关闭连接。这样可以避免发生没有正常关闭的情况。

还有一种方法就是管理更加细粒度的线程本地连接。

下面给出贴出文档。

Advanced Connection Management

Managing your database connections is as simple as calling  when you need to open a connection, and  when you are finished. In a web-app, you would typically connect when you receive a request, and close the connection when you return a response. Because connection state is stored in a thread-local, you do not need to worry about juggling connection objects peewee will handle it for you.

In some situations, however, you may want to manage your connections more explicitly. Since peewee stores the active connection in a threadlocal, this typically would mean that there could only ever be one connection open per thread. For most applications this is desirable, but if you would like to manually manage multiple connections you can create an .

Execution contexts allow finer-grained control over managing multiple connections to the database. When an execution context is initialized (either as a context manager or as a decorated function), a separate connection will be used for the duration of the wrapped block. You can also choose whether to wrap the block in a transaction.

Execution context examples:


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
author-avatar
lantshirt
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有