2015-11-12 6 views
0

У меня есть скрипт в 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 также в порядке.

+0

Свиток от Mysqldb до oursql сделал бы трюк? Я не знаю, что такое контекстный посредник ... – Biribu

+0

Пример mysqldb с менеджером контекста [здесь] (http://zetcode.com/db/mysqlpython/) (последний пример кода). Он характеризуется использованием ключевого слова 'with'. –

ответ

0

То, что я вижу здесь, возможно, является попыткой/за исключением более общего и универсального. Вы не знаете состояние X, когда возникает ошибка, и нет окончательного закрытия X во всех случаях.

Это не тот (дроид/коррекция), который вы ищете, но может помочь здесь уточнить об исключении исключения и выполнить правильную работу.

+0

Я постараюсь улучшить управление исключениями. Возможно добавление еще одного во внешнем. Также я буду проверять, как читать исключение, указанное x, когда это произойдет. – Biribu

Смежные вопросы