2017-08-01 43 views
0

我是Python编程的初学者(不超过6个月的学习和实践)。 我有一个GPS追踪器靠近我的车,另一个靠近我的父亲车。 我想将由这两个GPS追踪器发送的数据记录到数据库以备将来统计。 一切工作正常,直到我尝试写入数据通过TCP接收到MySQL表中。Python 3 MySQL GPS跟踪器数据库插入错误

我试图找到解决我的问题,但我没有成功(here,here,here)。 任何ideea,帮助,无论我会多么小将会被折服。

Console error message Get data from ('tracker_ip', 25904) ('tracker_id', latitude, longitude, '102456', '010817', 'N', 'E', '0', '0.00', 10.3) error: uncaptured python exception, closing channel <main.EchoHandler connected tracker_ip:25904 at 0x7f627f6e2b38> (:dbinsert() missing 1 required positional argument: '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() 

回答

0

我喜欢你的汽车与GPS的使用做什么。是不是那么容易调试这种事情没有一个前面的工作代码与变量玩,但有一些想法,已经使用pymysql了很多,也得到了错误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'等是安全的。

无论如何,我希望这些东西的作品,刚刚从我的经验,错误信息出现时,有什么不对的,因为这些变量在你的函数之间传递的括号内。