У меня есть скрипт в python, запущенный на малине, чтобы сохранить некоторые измерения, полученные ардуином.Как открыть соединение mysql и правильно закрыть
Он работал нормально, но внезапно измерения остались, чтобы прибыть. Я думал, что мой 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
Затем все снова начать работать.
Мой питон скрипт что-то вроде этого:
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 также в порядке.
Свиток от Mysqldb до oursql сделал бы трюк? Я не знаю, что такое контекстный посредник ... – Biribu
Пример mysqldb с менеджером контекста [здесь] (http://zetcode.com/db/mysqlpython/) (последний пример кода). Он характеризуется использованием ключевого слова 'with'. –