Seite 1 von 1

Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Freitag 31. Mai 2024, 14:49
von Zinober
Hallo,

könnt ihr mir ein Python-Paket bzw. eine Schnittstelle empfehlen, mit der der Zugriff auf mehrere Datenbanken (bzw. genauer: table_schema) gleichzeitig möglich ist?

Direkt auf der MySQL-Konsole, aber auch bei PHP-PDO ist es möglich SQL-Kommandos auszuführen, ohne eine Datenbank (table_schema) vorauszuwählen. Der Datenbankname wird dann dem Tabellenname durch einen '.' getrennt vorangestellt. (SELECT * FROM db.table WHERE 1) Auf die Weise ist es dann auch möglich verknüpfte Abfragen über mehrere Datenbanken hinweg auszuführen. ( SELECT * FROM db1.table1 AS a WHERE a.id IN (SELECT id FROM db2.table2)) Natürlich müssen die Datenbanken auf demselben Server laufen.

Ich habe dasselbe nun mit pymysql und mysql-connector-python probiert und es scheint bei beiden nicht zu gehen. Ich muss bei beiden eine Datenbank vorauswählen und deren Name wird in den Abfragen dann automatisch dem Tabellennamen vorangestellt, was dann zu solchen Fehlermeldungen führt:

ProgrammingError: 1146 (42S02): Table 'db1.db1.table1' doesn't exist

Kennt vielleicht jemand ein Paket, mit dem das möglich ist oder hat einen Tipp, wie ich es mit den genannten doch hinbekomme?

Vielen Dank im Voraus!

Re: Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Freitag 31. Mai 2024, 18:42
von noisefloor
Hallo,

also nach meinem Verständnis der Doku sollte PyMySQL das können, wenn du bei `connection = pymysql.connect(database=None, ... andere Argumente nach Notwendigkeit...)` angibst. Dann sollte sich PyMySQL nur mit dem Server verbinden und du _musst_ den Namen der Datenbank explizit mit angeben.

Gruß, noisefloor

Re: Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Freitag 31. Mai 2024, 19:01
von Zinober
Hallo,

vielen Dank für deine Antwort!

Das Verbinden funktioniert, aber die Abfrage

cursor.execute("SELECT * FROM `%s.%s` WHERE `%s`='';" % (datenbank, tabelle, spalte))

gibt mir einen

OperationalError: (1046, 'No database selected')

Ich finde dazu in der Doku (readthedocs.io) auch keine explizite Erwähnung.

Viele Grüße, Zinober

Re: Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Freitag 31. Mai 2024, 19:15
von noisefloor
Hallo,

das funktioniert so auch nicht, egal ob mit oder ohne explizit vorgegebener Datenbank. Dafür werden keine Platzhalter unterstützt.

Abgesehen davon: Wenn man das Gefühl hat, dass machen zu müssen, sollte man sich über seinen Programmentwurf Gedanken machen. Datenbank und Tabelle gibt man normalerweise explizit an.

Gruß, noisefloor

Re: Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Freitag 31. Mai 2024, 19:23
von Zinober
Hallo,

das ist die eingebaute 'old style' string formatting-Funktion. Das funktioniert.

Viele Grüße, Zinober

Re: Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Freitag 31. Mai 2024, 21:50
von __blackjack__
@Zinober: Der Nachsatz bleibt bestehen: Das ist komisch bis falsch. Was versuchst Du da *eigentlich* zu machen.

Mit dem ``%``-Operator wird das auch problematisch wenn Du tatsächlich Platzhalter für Werte brauchst, denn das ist bei MySQL ja *auch* "%s".

Anstelle der Backticks (`) könnte/sollte man vielleicht auch besser ' verwenden. Das wäre Standard-SQL.

Re: Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Samstag 1. Juni 2024, 07:26
von Zinober
Guten Morgen!

Noisefloor, du hattest Recht: Es funktioniert mit pymysql, wenn man keine Datenbank angibt. Ich hatte nur die Backticks falsch gesetzt. Der Punkt, der Datenbankname und Tabellenname trennt, darf nicht innerhalb der Backticks stehen. So muss es aussehen:

Code: Alles auswählen

 cursor.execute("SELECT * FROM `%s`.`%s` WHERE `%s`='5';" % (datenbank, tabelle, spalte))
Mit mysql-connector-python funktioniert das auch.

Die Verwendung der Backticks selbst ist aber richtig. Einfache Anführungszeichen funktionieren nicht. (https://dev.mysql.com/doc/refman/8.0/en ... fiers.html)

Und mit den %s muss man tatsächlich aufpassen. Im Notfall kann man sie aber sogar mischen (allerdings nur bei pymysql):

Code: Alles auswählen

 cursor.execute("SELECT * FROM `%s`.`%s` WHERE `%s`=%s;" % (datenbank, tabelle, spalte,'%s'), ('5'))
Aber schön ist das zugegebenermaßen nicht.

Vielen Dank nochmal für die Hilfe!

Viele Grüße, Zinober

Re: Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig

Verfasst: Samstag 1. Juni 2024, 10:52
von __blackjack__
Die Backticks sind halt nicht Standard-SQL sondern MySQL. Und die verlinkte Doku sagt ja auch, dass man MySQL so konfigurieren kann, dass " zum Quoten möglich sind. (Da hatte ich übrigens in meinem letzten Beitrag " und ' verwechselt, sorry.)