Вопрос:

Как проверить соединение вживую в python?

python python-3.x

6020 просмотра

3 ответа

349 Репутация автора

Я делаю проект для чтения метки RFID, используя python на Raspberry Pi и с помощью считывателя RDM880.

Моя идея состоит в том, чтобы не торопиться, чтобы проверить с персоналом, чтобы работать вовремя или нет.

Я пытаюсь добавить card_ID, time_in, time_out к локальному mysql и удаленному mysql (IP: 192.168.137.1), используя python.

У него одна и та же таблица в удаленном и локальном mysql.

Если MySQL удаленный сломан, я хочу добавить только локальный MySQL.

Вот мой код:

import serial
import time
import RPi.GPIO as GPIO
import MySQLdb
from datetime import datetime
from binascii import hexlify
serial=serial.Serial("/dev/ttyAMA0",                    
                  baudrate=9600,                     
                  parity=serial.PARITY_NONE,                    
                  stopbits=serial.STOPBITS_ONE,                    
                  bytesize=serial.EIGHTBITS,
                  timeout=0.1) 
db_local = MySQLdb.connect("localhost","root","root","luan_van") #connect local
db = MySQLdb.connect("192.168.137.1", "root_a","","luan_van") #connect remote
ID_rong = 128187 # reader respone if no card
chuoi= "\xAA\x00\x03\x25\x26\x00\x00\xBB"
def RFID(str): #function read RFID via uart 
      serial.write(chuoi)
      data = serial.readline()
      tach_5 = data[5]
      tach_6 = data[6]
      hex_5 = hexlify(tach_5)
      hex_6= hexlify(tach_6)
      num_5 = int(hex_5,16)
      num_6 = int(hex_6,16)
      num_a = num_5 * 1000 + num_6
      if(num_a != ID_rong):
            tach_7 = data[7]
            tach_8 = data[7]
            hex_7 = hexlify(tach_7)
            hex_8= hexlify(tach_8)
            num_7 = int(hex_7,16)
            num_8 = int(hex_8,16)
            num = num_8 + num_7 * 1000 + num_6 * 1000000 + num_5 * 1000000000
      else:
            num = num_5 * 1000 + num_6
      return num
def add_database(): # add card_ID and time_in to remote mysql
      with db:
           cur = db.cursor()
           cur.execure("INSERT INTO tt_control(Card_ID,Time_in) VALUES ('%d',NOW()) " %num)
           return
def add_database_local(): # add card_ID and time_in to remote mysql
      with db_local:
           cur = db_local.cursor()
           cur.execure("INSERT INTO tt_control(Card_ID,Time_in) VALUES ('%d',NOW()) " %num)
           return
def have_ID(int): #check ID in table tt_control
       with db_local:
           cur = db_local.cursor(MySQLdb.cursors.DictCursor)
           cur.execute("SELECT * FROM tt_control WHERE Card_ID = '%d'" %num)
           rows = cur.fetchall()
           ID=""
           for row in rows:
               ID = row['Card_ID']
       return ID
def add_time_out(): #add time out to remote mysql
       with db:
           cur = db.cursor(MySQLdb.cursors.DictCursor)
           cur.execute("UPDATE tt_control SET Time_out = NOW() WHERE Card_ID = '%d'" %num)
       return
def add_time_out_local(): #add time out to local mysql
       with db_local:
           cur = db_local.cursor(MySQLdb.cursors.DictCursor)
           cur.execute("UPDATE tt_control SET Time_out = NOW() WHERE Card_ID = '%d'" %num)
       return

  def add_OUT(): #increase Card_ID to distinguish second check
     with db:
           cur = db.cursor(MySQLdb.cursors.DictCursor) 
           cur.execute("UPDATE tt_control SET Card_ID = Card_ID + 1 WHERE Card_ID = '%d'" %num)
     return
  def add_OUT_local(): #increase Card_ID to distinguish second check
     with db_local:
           cur = db_local.cursor(MySQLdb.cursors.DictCursor) 
           cur.execute("UPDATE tt_control SET Card_ID = Card_ID + 1 WHERE Card_ID = '%d'" %num)
     return
  while 1:
     num = RFID(chuoi)
     time.sleep(1)
     Have_ID =have_ID(num)
     if(num != ID_rong):
            if(Have_ID ==""):
                 add_database() #---> it will error if remote broken, how can i fix it?
                 add_database_local()
            else:
                 add_time_out() #---> it will error if remote broken, how can i fix it? I think connection alive can fix, but I don't know
                 add_time_out_local()
                 add_OUT()
                 add_OUT_local() #---> it will error if remote broken, how can i fix it?
Автор: nistelrooy41001662 Источник Размещён: 04.11.2014 07:11

Ответы (3)


3 плюса

3600 Репутация автора

Решение

У вас есть пара вариантов:

(не так хорошо) Пингуйте сервер регулярно, чтобы поддерживать соединение.

(лучше всего) Обработайте исключение MySQLdb при вызове cur.execute, заново установив соединение и повторив попытку вызова. Вот отличный и краткий ответ, как это сделать . Из этой статьи вы сами обрабатываете исключение:

def __execute_sql(self,sql,cursor):
    try:
        cursor.execute(sql)
        return 1
    except MySQLdb.OperationalError, e:            
        if e[0] == 2006:
            self.logger.do_logging('info','DB', "%s : Restarting db" %(e))
            self.start_database()
            return 0

(наконец) Установите новое соединение с базой данных непосредственно перед тем, как вы фактически вызовете записи базы данных. В этом случае, переместите dbи db_localопределение в функцию , которую вы называете непосредственно перед cursor. Если вы делаете тысячи запросов, это не самый лучший. Однако, если это только несколько запросов к базе данных, это, вероятно, хорошо.

Автор: VooDooNOFX Размещён: 05.11.2014 12:34

3 плюса

430 Репутация автора

Я использую следующий метод:

def checkConn(self):
    sq = "SELECT NOW()"
    try:
        self.cur.execute( sq )
    except pymysql.Error as e:
        if e.errno == 2006:
            return self.connect()
        else:
            print ( "No connection with database." )
            return False
Автор: Al Berger Размещён: 22.02.2015 09:15

0 плюса

1 Репутация автора

Я использовал простую технику. Изначально я подключился к БД, используя:

conect = mysql.connector.connect(host=DB_HOST, user=DB_USER, password=DB_PASS, database=DB_NAME)

Всякий раз, когда мне нужно проверить, подключена ли БД, я использовал строку:

conect.ping(reconnect=True, attempts=3, delay=2)

Это проверит, живо ли соединение с БД. Если нет, он перезапустит соединение, которое решит проблему.

Автор: AKHILKUMAR DOPPALAPUDI Размещён: 13.06.2019 05:21
Вопросы из категории :
32x32