如何打开mysql连接并正确关闭

时间:2015-11-12 09:45:18

标签: python mysql database database-connection zeromq

我在树莓上运行了一个脚本,以保存arduino收到的一些测量结果。

它工作了一段时间,但突然测量到了。我以为我的arduino被绞死但是检查日志我得到了这个:

Traceback (most recent call last):
  File "/home/pi/service-storer/service-storer.py", line 7, in <module>
db="smart_reptil")
  File "/usr/lib/python2.7/dist-packages/MySQLdb/__init__.py", line 81, in Connect
return Connection(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 187, in __init__
super(Connection, self).__init__(*args, **kwargs2)
_mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

在阅读了一些网页后,我发现了一个stackoverflow主题:

ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
service mysqld restart

然后,一切都重新开始了。

我的python脚本是这样的:

import zmq
import MySQLdb

###############################################################################
########################## MySQLdb configuration ##############################
###############################################################################

conn = MySQLdb.connect(host= "127.0.0.1",
                  user="root",
                  passwd="database_pass",
                  db="database_name")
############################## SUBSCRIBER #####################################

portSub = "5566"
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:%s"% portSub)
socket.setsockopt(zmq.SUBSCRIBE,'CC')

############################### PUBLISHER ######################################

portPub = "5556"
#contextPub = zmq.Context()
socketPub = context.socket(zmq.PUB)
socketPub.connect("tcp://127.0.0.1:%s"% portPub)

################################################################################


more = True
part = []
while True:
    if socket.recv() == "CC":
        more = True
        while more:
            part.append(socket.recv())
            more = socket.getsockopt(zmq.RCVMORE)
        #print part[0]
        if int(part[0]) == 99:
            try:
                x = conn.cursor()
                x.execute("INSERT INTO devices (state,sensor_size, relay_size) VALUES (0, %d,%d)" % (int(part[2]), int(part[4])))
                conn.commit()
                x.execute("SELECT LAST_INSERT_ID()")
                row = x.fetchone()
                x.close()
            except:
                #ser.write("error")
                print "ERROR"
                conn.rollback()
    #clean part array for next frame
    part = []

我是否在使用mysql做错了什么?我应该改变打开和关闭光标的方式以避免这种行为吗?它是我脚本外部的东西吗?

Raspberry pi(2 b +)有25 gb免费。 ram内存也没关系。

1 个答案:

答案 0 :(得分:0)

我在这里看到的可能是尝试/除了更多的通用和通才。发生错误时你不知道X的状态,并且在所有情况下都没有最终关闭X.

这不是你正在寻找的(机器人/修正),但可能有助于更准确地捕捉异常,并在其中做正确的工作。