GPS Daten in MySQL schreiben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
obelixus
User
Beiträge: 5
Registriert: Dienstag 20. Mai 2014, 17:36

Hallo,

ich bin noch neu bei Python und MySQL, habe aber durch viel lesen und probieren schonmal ein paar Dinge hin bekommen. Aber nun habe ich ein Script das GPS Daten aus einem Empfänger liest und in der Linuxkonsole mit dem "Print" Befehl ausgibt. Mein Problem ist nun das ich es nicht hinbekomme das zu ändern das alles in eine MySQL Datenbank geschrieben wird. Könnt ihr mir vielleicht helfen?
Mein Script ist von "Kampis Elektroecke" http://kampis-elektroecke.de/?page_id=3674

Es müßte so sein das beim starten von dem Script die Tabelle geleert wird und dann die neuen Daten vom GPS gespeichert werden.

Vielen Dank und viele Grüße

Frank
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Was sind denn deine konkreten Schwierigkeiten? Findest du kein Modul um die Datenbank anzusprechen? Kommst du mit der Dokumentation des Moduls nicht klar? Hast du Probleme mit den SQL-Statements?
obelixus
User
Beiträge: 5
Registriert: Dienstag 20. Mai 2014, 17:36

/me hat geschrieben:Was sind denn deine konkreten Schwierigkeiten? Findest du kein Modul um die Datenbank anzusprechen? Kommst du mit der Dokumentation des Moduls nicht klar? Hast du Probleme mit den SQL-Statements?
Hmm, also... *lach* Ich muß ja das Datenbankmodul mit importieren

Code: Alles auswählen

import MySQLdb
, dann muß ich ja die Verbindung zur Datenbank herstellen

Code: Alles auswählen

con = mdb.connect('localhost', 'testuser', 'test623', 'testdb');
, das läuft ja auch soweit.
Was ich dann gar nicht weiß ist, wie ich mit python alle Daten aus der Tabelle lösche.
Dann kommt ja die Sache mit dem Cursor setzen, das verstehe ich irgendwie nicht.

Code: Alles auswählen

cur = con.cursor()
setzt ja dann den Cursor in die Tabelle, oder?
Wenn bis dahin ja alles richtig ist kommt ja:

Code: Alles auswählen

cur.execute("INSERT INTO Testtabelle
Dahinter müßte ich ja dann die Variablen einsetzen. Mein Problem ist nur das das nie funktioniert, und ich da auch immer wieder andere Schreibweisen finde.
Zum Beispiel das hier:

Code: Alles auswählen

cursor.execute("""INSERT INTO Adressen (Name, Strasse, PLZ, Ort) VALUES (%s, %s, %s, %s)"""
Warum sind da so viele ", und normalerweise müßte ich das ja so schreiben, oder? Meine MySQL Tabelle heißt "gps_daten", und die Spalten "lat",lon" und "time". Die Variablen aus dem GPS Script heißen ja orginal "Breitengrad,"Laengengrad" und "Uhrzeit".

Code: Alles auswählen

cursor.execute("""INSERT INTO gps_daten (lat, lon, time) VALUES (Breitengrad, Längengrad, Uhrzeit)"""
BlackJack

@obelixus: Irgendwelche Texte in literalen Zeichenketten werden nicht auf magische Weise durch den Inhalt von Variablen ersetzt. Letztendlich sollte man das sowieso nicht selber machen, sondern entsprechende Platzhalter für die Werte in die Zeichenkette mit der SQL-Anweisung setzten und dann die Werte der `execute()`-Methode als zweites Argument übergeben. Die Platzhalter bei `MySQLdb` sind '%s'.

Wenn Dich die vielen " wundern, solltest Du ein Grundlagentutorial durcharbeiten. Die verschiedenen Arten Zeichenkettenliterale zu schreiben, sollten dort erwähnt werden.

Der Cursor wird nicht gesetzt, schon gar nicht in eine Tabelle, denn Du gibst da ja gar keine Tabelle an, sondern das ist das Objekt mit dem die Anfragen gestellt werden und das die Ergebnisse liefert. Ob die Datenbank auf der anderen Seite tatsächlich ein Cursor-Konzept kennt, spielt dabei keine Rolle.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

obelixus hat geschrieben:Was ich dann gar nicht weiß ist, wie ich mit python alle Daten aus der Tabelle lösche.
Per SQL entweder mit "DELETE FROM tabelle WHERE ..." oder mit "TRUNCATE tabelle". Ich würde die erste Variante vorziehen, da der Datenbankuser dafür nicht so viele Rechte benötigt.
obelixus
User
Beiträge: 5
Registriert: Dienstag 20. Mai 2014, 17:36

BlackJack hat geschrieben:@obelixus:
Wenn Dich die vielen " wundern, solltest Du ein Grundlagentutorial durcharbeiten. Die verschiedenen Arten Zeichenkettenliterale zu schreiben, sollten dort erwähnt werden.
Danke für die Hilfe hier, auch an die anderen vielen Dank das ihr einem Anfänger wie mir schreibt! Ich sollte wohl wirklich mal die Grundlagen durchlesen. Bis jetzt habe ich mir immer ein Skript gesucht das es schon gibt und es durchgelesen und versucht zu verstehen, und dann anzupassen wie ich es brauche. Aber für die Verbindung MySQL und GPS habe ich kein funktionierendes Skript gefunden, und muss nun selbst lernen wie es geht...
obelixus
User
Beiträge: 5
Registriert: Dienstag 20. Mai 2014, 17:36

/me hat geschrieben:
obelixus hat geschrieben:Was ich dann gar nicht weiß ist, wie ich mit python alle Daten aus der Tabelle lösche.
Per SQL entweder mit "DELETE FROM tabelle WHERE ..." oder mit "TRUNCATE tabelle". Ich würde die erste Variante vorziehen, da der Datenbankuser dafür nicht so viele Rechte benötigt.
Das werde ich dann mal versuchen, aber im Moment hat mein Rad leider keine Internetverbindung, muß da mal nachgucken was da los ist. Und dann berichte ich mal ob ich es hinbekommen habe. Wenn es morgen nicht zu viel regnet tausche ich mal die Simkarten aus, stelle alles ein und dann teste ich nochmal das Skript.

VG

Frank

P.S.: Das Rad für das ich all das hier brauche ist übrigens ein Python Trike :-D
obelixus
User
Beiträge: 5
Registriert: Dienstag 20. Mai 2014, 17:36

Hallo,

ich komme einfach nicht klar damit. Ich hänge nun mal das Skript an, vielleicht hat ja einer von euch Zeit und Lust die Stelle an der die Daten in MySQL übertragen werden sollen zu korrigieren. Ich versteh nicht ganz was da falsch ist. Irgendwas mit den Einrückungen???

Danke und viele Grüße

Frank

Code: Alles auswählen

import serial
import time
import datetime
import os
import sys
import MySQLdb as mdb

try:
    serial = serial.Serial("/dev/ttyACM0", baudrate=4800)
    time.sleep(1)
    con = mdb.connect('test', 'test', 'test', 'test');
    cur = con.cursor()

except:
    print "Error opening serial port."
    sys.exit(1)

resp = ""

try:
 while True:

	Zeichen = 0

	# String leeren
	Input = ""
	
	# Zeichen empfangen
	Zeichen = UART.read() 
	
	# Pruefen ob Uebertragung gestartet wurde
	if Zeichen == "$":

		# Zeichen 2-6 einlesen
		for Counter in range(4):

			Zeichen = 0
			Zeichen = UART.read()
			Input = Input + str(Zeichen)
	
		# Pruefen ob das GGA Protokoll gesendet wird
		if Input == "GPGG":

			# Zeichen empfangen bis ein LF als Abschluss kommt
			while Zeichen != "\n":
				Zeichen = 0
				Zeichen = UART.read()
				Input = Input + str(Zeichen)
				
			Input = Input.replace("\r\n", "")
	
			# Datensatz nach jedem "," trennen und in einer Liste speichern
			Datenliste = Input.split(",")

			# Laenge des Datensatzes feststellen
			Laenge = len(Input)

			# Uhrzeit herausfiltern
			Uhrzeit = Datenliste[1]
			time = Uhrzeit[0:2] + ":" + Uhrzeit[2:4] + ":" + Uhrzeit[4:6]

			# Laengen und Breitengrad herausfiltern und berechnen
			Breitengrad = float(Datenliste[2])
			lat = Breitengrad / 100

			Laengengrad = float(Datenliste[4])
			lon = Laengengrad / 100

    cur.execute("INSERT INTO gps_daten (time,lat,lon) VALUES (%s,%s,%s)")
    con.commit()
    time.sleep(0.5)
    resp = ""

finally:
    if con:
        con.close()
    serial.close()
BlackJack

@obelixus: Bekommst Du denn eine Fehlermeldung bezüglich der Einrückung?

Schreib das gesamte Programm doch mal nicht als einen riesigen Codeklumpen auf Modulebene sondern teil das in kleine in sich geschlossene Funktionen auf, die jeweils eine Aufgabe erledigen. Die kann man dann unabhängig voneinander testen. Das erleichtert die Fehlersuche auch ungemein wenn man weiss was schon funktioniert und was nicht.
Antworten