Python 3 MySQL GPS 跟踪器数据库插入错误
Python 3 MySQL GPS tracker database insert error
我是 Python 编程的初学者(不超过 6 个月的学习和实践)。
我有一个 GPS 跟踪器连接到我的车上,另一个连接到我父亲的车上。
我想将这两个 GPS 跟踪器发送的所有数据记录到数据库中以供将来统计。
一切正常,直到我尝试将通过 TCP 接收的数据写入 mysql table.
我试图找到解决问题的方法,但没有成功 (here,here,here)。
任何想法,帮助,无论我多么渺小,都会受到赞赏。
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()
我喜欢你用汽车和 GPS 做的事情。如果没有前面的工作代码来处理变量,调试这种东西并不容易,但有一些想法,因为已经使用过pymysql
很多,也有那个错误 missing 1 required positional argument
要尝试的事情:
去掉 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 规则。检查了我的代码,这个字符串周围没有括号。
在这里尝试一组额外的括号:self.cursor.execute((cmd,data_tuple))
在 handle_read 函数中尝试一组额外的括号:
Database.dbinsert((data_tuple))
将cursorclass=pymysql.cursors.DictCursor
添加到此处括号中的内容('localhost','db_user','password','db' )
为了安全起见,您甚至可能想用句柄、host='localhost'
等来填充这些内容。
无论如何,我希望其中一个能起作用,根据我的经验,当这些变量在函数之间传递时,括号出现问题时会出现错误消息。
我是 Python 编程的初学者(不超过 6 个月的学习和实践)。 我有一个 GPS 跟踪器连接到我的车上,另一个连接到我父亲的车上。 我想将这两个 GPS 跟踪器发送的所有数据记录到数据库中以供将来统计。 一切正常,直到我尝试将通过 TCP 接收的数据写入 mysql table.
我试图找到解决问题的方法,但没有成功 (here,here,here)。 任何想法,帮助,无论我多么渺小,都会受到赞赏。
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()
我喜欢你用汽车和 GPS 做的事情。如果没有前面的工作代码来处理变量,调试这种东西并不容易,但有一些想法,因为已经使用过pymysql
很多,也有那个错误 missing 1 required positional argument
要尝试的事情:
去掉
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 规则。检查了我的代码,这个字符串周围没有括号。在这里尝试一组额外的括号:
self.cursor.execute((cmd,data_tuple))
在 handle_read 函数中尝试一组额外的括号:
Database.dbinsert((data_tuple))
将
cursorclass=pymysql.cursors.DictCursor
添加到此处括号中的内容('localhost','db_user','password','db' )
为了安全起见,您甚至可能想用句柄、host='localhost'
等来填充这些内容。
无论如何,我希望其中一个能起作用,根据我的经验,当这些变量在函数之间传递时,括号出现问题时会出现错误消息。