Seite 1 von 1
Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 09:38
von genervternewbie
Die Überschrift könnte etwas verwirren. Aber es hat nichts direkt mit Datenbanken bzw ihre Tabellen zu tun, sondern nur Verbindungsaufbau, obwohl es nur Indirekt mit dem Aufbau zu tun hat.
Ok nun zu meinem Problem. Ich habe eine tolle lösung für ein vor mir geschriebens script bekommen wo ich auch viel daraus gelernt habe.
Aber jüngste Ereignisse brachten mich zum Nachdenken bzw umdenken.
Code: Alles auswählen
[code]
def inittializie()
mydb = mysql.connector.connect(
host="localhost", #oder host="192.1681.1.X",
user="suse",
password="linux",
)
...
return mydb, ...
[/code]
weiter unten
wieder weiter unten
Versuche weitere Abfragen
Code: Alles auswählen
def inittializie()
try:
mydb = mysql.connector.connect(
host="192.168.1.200",
user="suse",
password="linux",
)
print("192.168.1.200 vorhanden")
except mysql.connector.errorsProgrammingError:
print("192.168.1.200 nicht vorhanden")
mydb = mysql.connector.connect(
host="192.168.1.9",
user="suse",
password="linux",
)
print("192.168.1.9 vorhanden")
...
return mydb, ...
Für sich alleine läuft meine Abfrage ( ab try bis ende vomm try )
Könnte es sein das es sich hierbei um Lokale Variablen handelt ?
Wenn " Ja " , gibt es eine Lösung, wenn " Nein " , dann muß ich mir was anderes einfallen lassen.
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 09:41
von sparrow
Ich verstehe deine Frage nicht.
Bitte zeige ein vollständiges Beispiel, lauffähiges, das nicht funktioniert, erkläre was du erwartest und was stattdessen passiert.
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 09:48
von einfachTobi
Zunächst ist dein zusammenkopiertes Beispiel nicht lauffähig, weil da ein Punkt fehlt. Wenn du Code zeigst, dann zeige auch
genau den Code, den du ausführst.
Ähhh was? Es ist nicht ganz ersichtlich was denn dein Problem ist. Für was brauchst du eine Lösung? Gibt es eine Fehlermeldung? Gibt inittializie() mehr als die DB-Verbindung zurück? So wie dein Schnipsel in der main() aussieht, führst du die Funktion nicht aus, willst aber ihren Rückgabewert verwenden. Schau dir mal
https://docs.python.org/3/tutorial/cont ... -functions an.
PS: Es heißt `initialize` statt `inittializie`.
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 11:28
von __deets__
Der Versuch, eine Verbindung zu mehreren Datenbanken aufzubauen, ist auch ungeschickt. Statt da viel Code zu wiederholen & auch noch unflexibel zu sein, macht man das einfach so:
Code: Alles auswählen
DB_CONNECTIONS = [
("192...1", "foo", "bar"),
("192...2", "baz", "bla"),
...]
for host, username, password in DB_CONNECTIONS:
try:
connection = mysql.connector.connect(
host=host,
user=username,
password=password,
)
break
except <der-verbindungsfehler>:
pass
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 11:58
von genervternewbie
mein ganzer code würde zu groß werden, und mein fehler konnte ich schon auf das begrenzen
ich habe einfach was aufbeuen wollen
da ich 2 DBs habe ( intern ( Localhost (192.168.1.X) ), extern (192.168.1.X)
und möchte mich mit extern verbinden wenn die nicht da ist dann intern
mit try kann ich prüfen ob ja oder nein mal vereinfacht gesagt
Code: Alles auswählen
try:
Anweisung
:
Anweisung
print("DB Ja")
except Error:
print("DB Nein")
Anweisung
:
Anweisung
print("DB Ja")
schreibe was in tabelle
für sich alleine klapt das script
wenn ich jetzt weiter mache außerhalb vom try
habe ich nicht die DB zur verfügung
im grunde
if DB == ja:
Nutze diesse DB
else:
Sonst nutze diese DB
das ganze soll dannin def landen muß aber nicht
so kam ich auf try
wenn ich es richtig verstanden habe dann wäre es was in try oder except steht eine lokale variable
ich brauche sie als globale variable
Sind es dan nnoch variablen oder was ist es dann
ich will keine lösung sondern ich versuche etwas zu verstehen
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 12:01
von __deets__
Das ist doch in dem Code von Sirius3 schon gezeigt worden: sowas gibt man als Wert zurueck, um damit dann an anderer Stelle zu arbeiten. Und ja, das ist eine lokale Variable, denn mit globalen arbeitet man nicht.
Code: Alles auswählen
def connect_to_db():
connection = <was-auch-immer>
return connection
def work_with_db(connection):
connection.execute(...)
def main():
connection = connect_to_db()
while True:
work_with_db(connection)
Look, Ma, no global variables.
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 12:07
von einfachTobi
Du sollst ja auch nicht den ganzen Code posten, sondern den Code, der mit dem Fehler zusammenhängt. Aber eben genau den, den du auch ausführst. Mit dem Pseudocode hier kann man doch wieder nur raten. Mein Hinweis auf die Grundlagen von Funktionen bleibt bestehen:
https://docs.python.org/3/tutorial/cont ... -functions. Vielleicht in Verbindung mit:
https://docs.python.org/3/tutorial/cont ... -functions
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 12:47
von genervternewbie
Code: Alles auswählen
#!/usr/bin/env python3
from RPi import GPIO
import mysql.connector
from contextlib import closing
def initialize():
lcd = lcddriver.lcd()
lcd.lcd_clear()
mydb = mysql.connector.connect(
host="localhost",
user="linux",
password="linux",
database="test"
)
#try:
# mydb = mysql.connector.connect(
# host="192.168.1.200", # Servername
# user="linuxa", # Benutzername hier fehlerhaft
# password="linux", # Passwort
# database="test"
# )
# lcd.lcd_display_string(host,1)
# lcd.lcd_display_string("vorhanden ",2)
# time.sleep(2)
#except mysql.connector.errors.ProgrammingError:
# lcd.lcd_display_string("192.168.1.200 ",1)
# lcd.lcd_display_string("nicht vorhanden ",2)
# time.sleep(2)
# mydb = mysql.connector.connect(
# host="localhost", # Servername
# user="pi", # Benutzername
# password="raspberry", # Passwort
# database="test"
# )
#time.sleep(2)
#lcd.lcd_display_string("Localhost wird ",1)
#lcd.lcd_display_string("verwendet ",2)
#time.sleep(2)
return mydb, lcd
def update_database(mydb):
with closing(mydb.cursor()) as cursor:
cursor.execute("INSERT INTO vtb (vtb01) VALUES (%s)",[
"1",
])
mydb.commit()
return "Eintrag"
def main():
lcd, mydb = initialize()
lcd.lcd_display_string("ALles Klara", 1)
result = update_database(mydb)
if result == "Eintrag":
pass
else:
assert False
if __name__ == "__main__":
main()
komplett reduziert
mit # ist mein Ziel
habe ich es richtig verstanden ?
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 13:52
von sparrow
Du bindest die Werte an falsche Namen.
Du gibst mydb, lcd zurück aber bindest an lcd, mydb
Ansonsten wird aus dem Code noch immer nicht verständlich, was eigentlich dein Problem ist.
Was genau funktioniert nicht? Warum hast du lauter time.sleep() da drin?
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 14:05
von __blackjack__
`update_database()` gibt immer "Eintrag" zurück, das macht keinen Sinn. Und auch das prüfen ob "Eintrag" dann auch wirklich "Eintrag" ist, beim Aufrufer ist sinnfrei.
Re: Datenbanken abfragen
Verfasst: Dienstag 1. Februar 2022, 14:22
von __blackjack__
`GPIO` wird importiert, aber nicht verwendet. `lcddriver` ist undefiniert. Ein Modul?
Wie man den auskommentierten Code durch eine Schleife über Zugangsdaten ersetzen kann, hat __deets__ doch bereits gezeigt.
Ich persönlich verwende ja sehr gerne SQLAlchemy, da kann man die Verbindungsdaten in *einer* URL angeben, statt in mehreren Einzelteilen.
Ungetestete Variante von __deets__ Ansatz mit Wörterbüchern für die Verbindungsdaten:
Code: Alles auswählen
#!/usr/bin/env python3
import time
from contextlib import closing
import lcddriver
import mysql.connector
import mysql.connector.errors
DB_CONNECTION_DATA = [
{
"host": "192.168.1.200",
"user": "linuxa",
"password": "linux",
"database": "test",
},
{
"host": "localhost",
"user": "pi",
"password": "raspberry",
"database": "test",
},
]
def initialize():
lcd = lcddriver.lcd()
lcd.lcd_clear()
for connection_data in DB_CONNECTION_DATA:
lcd.lcd_display_string(connection_data["host"], 1)
try:
db_connection = mysql.connector.connect(**connection_data)
except mysql.connector.errors.ProgrammingError:
lcd.lcd_display_string("nicht vorhanden", 2)
else:
lcd.lcd_display_string("vorhanden", 2)
break
time.sleep(2)
return lcd, db_connection
def update_database(db_connection):
with closing(db_connection.cursor()) as cursor:
cursor.execute("INSERT INTO vtb (vtb01) VALUES (1)")
db_connection.commit()
def main():
lcd, db_connection = initialize()
lcd.lcd_display_string("ALles Klara", 1)
update_database(db_connection)
if __name__ == "__main__":
main()