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!
Suche MySQL-Schnittstelle für Zugriff auf mehrere DBs gleichzeitig
- noisefloor
- User
- Beiträge: 3941
- 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
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
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
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
- noisefloor
- User
- Beiträge: 3941
- 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
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
- __blackjack__
- User
- Beiträge: 13549
- 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.
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.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
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:
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):
Aber schön ist das zugegebenermaßen nicht.
Vielen Dank nochmal für die Hilfe!
Viele Grüße, Zinober
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))
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'))
Vielen Dank nochmal für die Hilfe!
Viele Grüße, Zinober
- __blackjack__
- User
- Beiträge: 13549
- 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.)
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan