peewee mysql自动断开_flask+mako+peewee(下)(解决了Error 2006: MySQL server has gone away)

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

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

db = SqliteDatabase('base.db')

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

from playhouse importpool

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的基类

classBaseModel(Model):classMeta:

database=db

@classmethoddef getOne(cls, *query, **kwargs):#为了方便使用,新增此接口,查询不到返回None,而不抛出异常

try:return cls.get(*query,**kwargs)exceptDoesNotExist:return None

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

classXcfRootCategory(BaseModel):classMeta:

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这张表的内容。类的实例也就是这张表的实例。

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

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

@classmethoddefupdate_name(cls, xcf_category_id, name):try:

XcfRootCategory.update(name=name).where(XcfRootCategory.xcf_category_id ==xcf_category_id).execute()returnTrueexcept: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 connect() when you need to open a connection, and close() 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 ExecutionContext.

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:

with db.execution_context() as ctx:

# A new connection will be opened or, if using a connection pool,

# pulled from the pool of available connections. Additionally, a

# transaction will be started.

user = User.create(username='charlie')

# When the block ends, the transaction will be committed and the connection

# will be closed (or returned to the pool).

@db.execution_context(with_transaction=False)

def do_something(foo, bar):

# When this function is called, a separate connection is made and will

# be closed when the function returns.

If you are using the peewee connection pool, then the new connections used by the ExecutionContextwill be pulled from the pool of available connections and recycled appropriately.

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503374.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA程序员已成为最疯狂的加班行业,没有之一?

程序员界加班经常成为业界讨论的话题,夜幕降临,大楼里依然灯火通明时,那一刻,仿佛让我渐渐的忘记了时间,我知道我不是一个在加班,我不是一个人!连续加班已成为常事,一点不夸张。 “…

layui table reload post请求_如何实现在Layui框架中完成父窗口刷新(更新)

最近有个项目使用Layui框架进行后端系统的界面搭建,其中Layui框架中的Layer组件在项目中会用得非常多。且有些功能会遇到子窗口完成数据的提交后,进行关闭同时会刷新父窗口的数据,所以此文章分享一下《如何实现在Layui框架中完成父窗的刷新功…

Java开发人员需要掌握数据库的知识点有哪些?

现在主流的Java开发人员一般都需要会主流数据库。开发人员需要对Mysql、Oracle、SqlServer这三个常用的熟悉了解。在数据量比较大或者请求数比较高的情况下,需要了解一些特定数据库针对性优化。SQL相关入门熟悉表、字段、记录、索引等概念。 熟悉SQL的约束&#xff…

java jdbc mysql 乱码_【求助】为什么用纯java jdbc插入mysql一直乱码

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼String str "人造革";//gbk编码使用2个字节表示一个汉字,所以buffer的长度应该为6byte[] buffer str.getBytes("gbk");//[-56, -53, -44, -20, -72, -17]System.out.println("gbk编码的byte信息:"…

Java到底能做什么事情呢?

相信很多小伙伴看到标题第一个出现在脑海里的想法是赚钱,难道你们只知道java薪资高?那么你太low,Java的应用领域很广,可以说是现在最普及的,遍布各行各业,可见其优势所在。 1、大数据领域 Hadoop以及其他大数据处理技…

MySQL中怎么优化数据倾斜_Greenplum 调优--数据倾斜排查(一)

对于分布式数据库来说,QUERY的运行效率取决于最慢的那个节点。当数据出现倾斜时,某些节点的运算量可能比其他节点大。除了带来运行慢的问题,还有其他的问题,例如导致OOM,或者DISK FULL等问题。如何监控倾斜1、监控数据…

成为优秀的Java程序员要具备哪些技能?

Java是热门的编程语言,热衷技术,掌握一门语言,我们最重要的是知识的积累和运用,那我们需要掌握哪些技能才能成为优秀的Java程序员呢?小编来为大家解答一波。 1.拥有扎实的基础和深刻理解能力 Java 程序员&#xff0c…

mysql登陆 慢_mysql登陆慢问题解决

mysql登陆慢问题解决现象:系统正常, 本地登陆速度很快. 查询等操作没有问题. 日志无报错信息. 但远程登陆异常缓慢, 甚至需要等20分钟. 登陆后检查mysql> show processlist;存在大量处于login状态的未授权用户进程.解决:在my.cnf文件中加入参数 “skip-name-resolve” , 重新…

Java 平台有哪几个版本?

Java 平台的版本有哪些?我相信只要接触过Java入门的小伙伴都知道,但是问起你具体的细节你不一定能全部答的上来。 一、 Java SE(Java Platform,Standard Edition) Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务…

java编译源文件_Java实现编译源文件(Java源码)

代码案例:import java.util.ArrayList;import java.util.List;import javax.tools.DiagnosticCollector;import javax.tools.JavaCompiler;import javax.tools.JavaFileObject;import javax.tools.StandardJavaFileManager;import javax.tools.ToolProvider;public …

学习Java能够从事哪些工作?

学习Java编程能够胜任哪些工作?在互联网行业快节奏的发展,根据以往的经验,做一个简要的分析,掌握了Java这门技术,就业面也是很广的,不管是电脑方面的软硬件开发还是手机的软硬件开发Java都是必不可少的技术…

java面试题 sql_Java面试题总结之数据库与SQL语句

1、有3个表,表结构如下:Student学生表(学号,姓名,性别,年龄,组织部门)Course课程表(编号,课程名称)Sc选课表(学号,课程编号,成绩)。1)写一个SQL 语句,查询选修了’计算机…

Java 程序员必须掌握的 Linux 命令

作为一名程序员,小编觉得还是应该懂得linux,不说深入,起码的使用还是要会,能深入当然最好了,平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令。在做完项目上线时候,需要与…

java 二进制文件 数据库_java从数据库中读取二进制文件并....

弑天下首先你需要确定附件的类型及名称。然后下载很简单的,根据下载的请求返回response.addHeader ("content-type","application/RFC822");response.addHeader ("Content-Disposition","attachment; filenameword,pdf");O…

java 负数 位移运算_Java中的位移运算

在Java中&#xff0c;位移运算属于基本运算&#xff0c;符号是<>&#xff0c;即向左位移和向右位移。在Java中只有整数才能位移&#xff0c;所以其他的不考虑&#xff0c;位移运算是将整数在内存中表示的二进制进行位移&#xff0c;所以在Java中分为正数和负数的位移。对…

Alibaba之MySQL宝典_阿里巴巴内部 MySQL宝典 意外流出!极致经典,堪称数据库的天花板...

MySQL 是一个关系型数据库&#xff0c;使用 SQL 语言进行增删改查操作&#xff0c;目前属于 Oracle 旗下的产品。MySQL 数据库开源免费&#xff0c;能够跨平台&#xff0c;支持分布式&#xff0c;性能也不错&#xff0c;可以和 PHP、Java 等 Web 开发语言完美配合&#xff0c;非…

Java 哪些事最困扰你?

相信在学Java编程的小伙伴都会遇到很多的问题&#xff0c;特别是当我们写完程序的时候突然报个错&#xff0c;然后找了半天&#xff0c;却没发现哪里报错了&#xff0c;“我在哪”&#xff0c;“我在干什么”&#xff0c;“我写了什么”“怎么会这样”,会很爆炸的心态&#xff…

java数组 arraylist_JAVA 用数组实现 ArrayList

我们知道 ArrayList 是一个集合&#xff0c;它能存放各种不同类型的数据&#xff0c;而且其容量是自动增长的。那么它是怎么实现的呢&#xff1f;其实 ArrayList 的底层是用 数组实现的。我们查看 JDK 源码也可以发现。而用数组实现集合的原理有两点&#xff1a;1、能自动扩容2…

java sha1加密ascii码_如何使用加密芯片完成SHA1摘要运算

1. 测试目标使用LKT系列加密芯片进行SHA1摘要运算并使用openssl验证正确性2. 测试环境本示例LKT加密芯片运行环境为windows系统、测试软件LCS KIT、LKT-K100开发板。Linux ubuntu 14.04系统、OpenSSL 1.0.1f 6 Jan 2014。3. 测试步骤注意&#xff1a;“->”表示使用LCS KIT软…

这些Java基础面试知识点,你都掌握了吗?

想了解一下学Java的小伙伴们&#xff0c;在学习Java的时候有没有去总结知识点&#xff0c;哪些知识点我们没有掌握&#xff0c;哪些知识点是我们还没有掌握的&#xff0c;今天小编来发掘一些Java基础面试知识点&#xff0c;不知道大家掌握没有。 小编分享的一些知识点&#xf…