gpt4 book ai didi

python mysql自定义重新连接类不保持服务器连接打开

转载 作者:搜寻专家 更新时间:2023-10-30 23:19:18 25 4
gpt4 key购买 nike

我有一个用 python 编写的自定义类,用于在当前连接断开时重新建立 mysql 连接。唯一的问题是,当前那个似乎总是死了,并且总是进入我的 try-except 的 except block 。

class DB:
conn = None
def connect( self ):
try:
self.conn = MySQLdb.connect("localhost", "xxxx", "xxxxxx", "Systems")
except ( AttributeError, Mysqldb.OperationalError ), e:
raise e

def query( self, sql, params ):
try:
cursor = self.conn.cursor()
cursor.execute( sql, ( params ) )
except ( AttributeError, MySQLdb.OperationalError ), e:
print 'exception generated during sql connection: ', e
self.connect()
cursor = self.conn.cursor()
cursor.execute( sql, ( params ) )
cursor.close()
return cursor

def close( self ):
try:
if self.conn:
self.conn.close()
print '...Closed Database Connection: ' + self.conn
else:
print '...No Database Connection to Close.'
except ( AttributeError, MySQLdb.OperationalError ), e:
raise e

db = DB()
db.query( sql, myParams )

问题有两方面。 1) 当我调用 db.close() 时,我得到了 ...No Database Connection 输出。 2) 每次我执行 db.query( sql, myParams ) 它进入 except 子句并输出 exception generated during sql connection:

似乎我的数据库连接在每次查询调用后自行关闭。但我不知道为什么会这样。对此问题的任何帮助将不胜感激。

最佳答案

  • 第一次调用 db.query 时,self.conn 等于没有任何。所以确实,你总是会得到一个 在 sql 连接期间生成的异常第一次调用 db.query 时的消息。然而,随后的调用db.query 不会产生该消息。

    如果你添加

    def __init__(self):
    self.connect()

    然后 self.conn 将在您创建 db = DB() 时初始化。然后您不会收到错误消息。或者,如果您只想按需创建连接,则只需删除错误消息即可。

  • 您可以从 DB 类中删除 conn = None。通过在未设置 self.conn 时引发 AttributeError,代码仍然可以以基本相同的方式工作。

  • 另请注意,如果您的 sql 是一个 SELECT 语句,您不应该在 DB.query 中调用 cursor.close(),因为后续调用cursor.fetchall() 将不再有效。


下面是一些示例代码,表明通过上述更改后,sql 连接期间生成的异常 消息仅打印一次,db.close() 版画...关闭数据库连接: 应该如此。

如果您的代码有其他行为,请修改下面的代码以演示该行为。

import MySQLdb
import config

class DB:
def connect(self):
try:
self.conn = MySQLdb.connect("localhost",
config.USER, config.PASS, config.MYDB)
except (AttributeError, MySQLdb.OperationalError), e:
raise e

def query(self, sql, params = ()):
try:
cursor = self.conn.cursor()
cursor.execute(sql, params)
except (AttributeError, MySQLdb.OperationalError) as e:
print 'exception generated during sql connection: ', e
self.connect()
cursor = self.conn.cursor()
cursor.execute(sql, params)
return cursor

def close(self):
try:
if self.conn:
self.conn.close()
print '...Closed Database Connection: ' + str(self.conn)
else:
print '...No Database Connection to Close.'
except (AttributeError, MySQLdb.OperationalError) as e:
raise e

db = DB()
sql = '''DROP TABLE IF EXISTS foo'''
db.query(sql)

sql = '''CREATE TABLE foo (bar INT(11))'''
db.query(sql)

db.close()

# exception generated during sql connection: DB instance has no attribute 'conn'
# ...Closed Database Connection: <_mysql.connection closed at 8769f8c>

配置文件:

USER = 'myusername'
PASS = 'mypasswd'
HOST = 'localhost'
MYDB = 'dbname'

关于python mysql自定义重新连接类不保持服务器连接打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com