2017-08-01 4 views
0

私はPythonプログラミングの初心者です(6ヶ月以上の学習と実践)。 私の車にはGPSのトラッカーがあり、父の車にはGPSのトラッカーがあります。 この2つのGPSトラッカーによって送信されたalデータを将来の統計のためにデータベースにログします。 TCP経由で受信したデータをmysqlテーブルに書き込もうとするまで、すべてうまく動作します。Python 3 MySQL GPSトラッカーデータベースの挿入エラー

問題の解決方法を見つけようとしましたが、成功しませんでした(hereherehere)。 私がどれほど小さくても、理想、助け、どんなに助けてもらえます。

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

私はあなたが1の目の前で作業コードにすることなく、この種のものをデバッグすることは簡単ではないです..車や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の規則を破っても今のところ1行に入れてください。私のコードをチェックしていて、この文字列のまわりに括弧はありませんでした。

  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'などは安全です。とにかく

、私はこれらの変数は、あなたの関数間で渡されるブラケットに何か問題がある場合にエラーメッセージが起動することをちょうど私の経験から、これらのものの作品の一つを願っています。