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

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Zinober
User
Beiträge: 20
Registriert: Freitag 26. Dezember 2014, 15:58

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!
Benutzeravatar
noisefloor
User
Beiträge: 3882
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Zinober
User
Beiträge: 20
Registriert: Freitag 26. Dezember 2014, 15:58

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
Benutzeravatar
noisefloor
User
Beiträge: 3882
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Zinober
User
Beiträge: 20
Registriert: Freitag 26. Dezember 2014, 15:58

Hallo,

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

Viele Grüße, Zinober
Benutzeravatar
__blackjack__
User
Beiträge: 13291
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Zinober
User
Beiträge: 20
Registriert: Freitag 26. Dezember 2014, 15:58

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

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.)
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten