Datenbanken abfragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
genervternewbie
User
Beiträge: 25
Registriert: Samstag 17. November 2018, 18:42

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

Code: Alles auswählen

def main():
    mydb, .....
wieder weiter unten

Code: Alles auswählen

if __name__ == "__main__":
    main()
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.
Benutzeravatar
sparrow
User
Beiträge: 4535
Registriert: Freitag 17. April 2009, 10:28

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.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

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`.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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
genervternewbie
User
Beiträge: 25
Registriert: Samstag 17. November 2018, 18:42

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
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
einfachTobi
User
Beiträge: 512
Registriert: Mittwoch 13. November 2019, 08:38

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
genervternewbie
User
Beiträge: 25
Registriert: Samstag 17. November 2018, 18:42

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 ?
Benutzeravatar
sparrow
User
Beiträge: 4535
Registriert: Freitag 17. April 2009, 10:28

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?
Benutzeravatar
__blackjack__
User
Beiträge: 14020
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
__blackjack__
User
Beiträge: 14020
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`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()
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten