【问题标题】:Python 3 MySQL GPS tracker database insert errorPython 3 MySQL GPS跟踪器数据库插入错误
【发布时间】:2018-01-07 23:54:20
【问题描述】:

我是 Python 编程的初学者(学习和实践不超过 6 个月)。 我的车上有一个 GPS 追踪器,我父亲的车上还有一个。 我想将这两个 GPS 跟踪器发送的所有数据记录到数据库中以供将来统计。 一切正常,直到我尝试将通过 TCP 接收的数据写入 mysql 表。

我试图找到解决问题的方法,但没有成功 (here,here,here)。 任何想法、帮助,无论我多么渺小,都将不胜感激。

控制台错误消息 Get data from ('tracker_ip', 25904) ('tracker_id', 纬度, 经度, '102456', '010817', 'N', 'E', '0', '0.00', 10.3) 错误:未捕获的 python 异常,关闭通道 ma​​in.EchoHandler 连接 tracker_ip:25904 at 0x7f627f6e2b38> (:dbinsert() 缺少 1 个必需的位置 参数:'data_tuple' [/usr/lib/python3.5/asyncore.py|read|83] [/usr/lib/python3.5/asynco re.py|handle_read_event|423] [server3_1.py|handle_read|84])

我的代码

#!/usr/bin/python3
import pymysql
import asyncore
import socket
import re


class Database():
    def __init__(self):
        self.dbconnection = pymysql.connect('localhost','db_user','password','db' )
        self.cursor = self.dbconnection.cursor()

        sql = """CREATE TABLE IF NOT EXISTS GPS (
           signature  CHAR(50) NOT NULL,
           latitude REAL,
           orientationNS CHAR(1),
           longitude REAL,
           orientationEV CHAR(1),
           gpstime CHAR(10),
           gpsdate CHAR(10),
           speed CHAR(6),
           direction CHAR(3),
           distance REAL)"""
        self.cursor.execute(sql)
        self.dbconnection.commit()


    def dbinsert(self,data_tuple):

        cmd =("""INSERT INTO GPS (signature,latitude,longitude,gpstime,gpsdata,orientationNS,orientationEV,direction,speed,distance)\
          VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""")            
        self.cursor.execute(cmd,data_tuple)
        self.dbconnection.commit()



    def  __del__(self):
        self.dbconnection.close()



class ClientHandler(asyncore.dispatcher):

    def ConvertCoordinates(self,latitude,longitude):
        lat_degree = int(float(latitude) / 100);
        lng_degree = int(float(longitude) / 100);
        # Extracting minutes for latitude and longitude
        lat_mm_mmmm = float(latitude) % 100
        lng_mm_mmmmm = float(longitude) % 100

        converted_latitude = lat_degree + (lat_mm_mmmm / 60)
        converted_longitude = lng_degree + (lng_mm_mmmmm / 60)
        return (converted_latitude,converted_longitude)  #tuple

    def GetData(self,data_string):
        data_list = re.sub(r'\s', '', data_string).split(',')
        signature = data_list[1]
        latitude,longitude = self.ConvertCoordinates(data_list[5],data_list[7])
        orientationNS = data_list[6] #latitude
        orientationEV = data_list[8] #longitude
        gpstime = data_list[3]
        gpsdate =data_list[11]
        gps_fix_validate = data_list[4] #
        speed= data_list[9]
        direction = data_list[10]
        distance = 10.3 #dummy data
        return (signature,latitude,longitude,gpstime,gpsdate,orientationNS,orientationEV,direction,speed,distance)


    def handle_read(self):
        data = self.recv(8192)
        data_string = data.decode(errors="ignore")
        #print(len(data_string))
        if len(data_string) >= 84 and len(data_string) <= 88 :
            data_tuple = self.GetData(data_string)
            print(data_tuple)
            Database.dbinsert(data_tuple)


class DataServer(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        pair = self.accept()
        if pair is None:
            return
        else:
            sock, addr = pair
            print('Get data from %s' % repr(addr))
            handler = ClientHandler(sock)

database=Database()
server = DataServer('192.168.10.10', 21112)
asyncore.loop()

【问题讨论】:

    标签: mysql python-3.5 sql-insert mysql-python asyncore


    【解决方案1】:

    我喜欢你用汽车和 GPS 做的事情。如果没有前面的工作代码来处理变量,调试这种东西并不容易,但有一些想法,就像使用了 @987654321 @很多,也得到了那个错误missing 1 required positional argument

    要尝试的事情:

    1. 去掉cmd =("""INSERT INTO GPS (signature,latitude,longitude,gpstime,gpsdata,orientationNS,orientationEV,direction,speed,distance) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""") 周围的括号并将其放在一行中,即使这违反了 PEP 8 规则。检查了我的代码,这个字符串周围没有括号。

    2. 在此处尝试额外的一组括号,如下所示:self.cursor.execute((cmd,data_tuple))

    3. 在您的 handle_read 函数中尝试一组额外的括号: Database.dbinsert((data_tuple))

    4. cursorclass=pymysql.cursors.DictCursor 添加到此处('localhost','db_user','password','db' ) 括号中的内容中,为了安全起见,您甚至可能想用手柄、host='localhost' 等填写这些内容。

    无论如何,我希望其中一个能起作用,只是根据我的经验,当括号出现问题时会出现错误消息,因为这些变量是在你的函数之间传递的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 2017-08-24
      • 2016-07-01
      • 2017-05-23
      • 2011-08-15
      • 1970-01-01
      相关资源
      最近更新 更多