mysql.connector Datenbank in *.sql Datei sichern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Hallo Zusammen,

vorweg: der Code müsste aus "reinem" Python sein kein shell etc..

Ich habe eine frage an euch:

Ich versuche bzw. hatte vor meine Tabelle und nur dessen Inhalt zu sicher.
Aber auch nur die Daten welche mit einer WHERE Klausel passen würde sprich:

Code: Alles auswählen

"""
WHERE customer_ID = %s AND project_ID = %s
"""
als bsp.

Meine erste Frag hier wäre ist das überhaupt möglich ?
und wenn ja wie ??

die Enddatei sollte in etwa so aussehen:

Code: Alles auswählen

-- phpMyAdmin SQL Dump
-- version 4.9.6
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Erstellungszeit: 18. Apr 2021 um 15:49
-- Server-Version: 10.3.24-MariaDB
-- PHP-Version: 7.3.16

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Datenbank: `materialien__TEST`
--

--
-- Daten für Tabelle `projects`
--

INSERT INTO `projects` (`ID`, `customer_ID`, `project_ID`, `user_name`, `user_name_update`, `user_name_closed`, `customer_project`, `closed`, `date_create`, `date_update`, `date_closed`) VALUES
(1, 2382, 564895132, 'Benutzer', NULL, 'Benutzer', 'Wohnungsumbau', 1, '2021-01-08', NULL, '2021-01-30');
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Das ist eine *.sql Datei erzeugt mit phpMyAdmin und so etwas möchte ich gerne über Python erstellen können..
alles was ich bis her versucht hatte ging nicht weil Shell mit dabei war....

ich hoffe irgend wer könnte mir helfen ;)

danke
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Bei dem Output handelt es sich, soviel ich weiß, um den Output von "mysqldump" - also dem Tool um eine Datenbank zu dumpen.
Das kennt auch einen "where"-Parameter um das Ergebnis einzuschränken.

Es handelt sich aber um ein Programm, keinen Befehl, denn du als Statement an die Datenbank senden kannst.

Ich arbeite nicht mit mySQL/mariadb - aber soweit ich weiß, geht kein Dump über eine Connection, weil das formatieren des Dumps in dem Tool passiert.
Das kannt du natürlich auch: die entsprechenden SQL-Befehle in das Ergebnis schreiben.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

sparrow hat geschrieben: Sonntag 18. April 2021, 16:06 Bei dem Output handelt es sich, soviel ich weiß, um den Output von "mysqldump" - also dem Tool um eine Datenbank zu dumpen.
"mysqldump" danach hatte ich auch schon geschaut aber alles was ich gefunden hatte ist mit angegeben das die shell verwendet werden soll...
das klappt leider nicht in meinem Fall.
sparrow hat geschrieben: Sonntag 18. April 2021, 16:06 Das kannt du natürlich auch: die entsprechenden SQL-Befehle in das Ergebnis schreiben.
Wie genau meinst du das ?
Die Datei einfach selbst erzeugen ? (*.sql)
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Indem du die Daten selektierst und als entsprechende SQL-Statements (oder auch nur ein Statement) in die .sql-Datei schreibst.
Du kannst dich daran oroentieren, wie mysqldump die Datei erstellt.

mysqldump ist ein Programm und hat nichts mit der Shell zu tun.
Programme kann man auch in Python aufrufen: Stichwort subprocess.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

sparrow hat geschrieben: Sonntag 18. April 2021, 16:42 Indem du die Daten selektierst und als entsprechende SQL-Statements (oder auch nur ein Statement) in die .sql-Datei schreibst.
Du kannst dich daran oroentieren, wie mysqldump die Datei erstellt.
Diesen Gedanken hatte ich auch bereits wenn ich das anders nicht gelöst bekomme.
sparrow hat geschrieben: Sonntag 18. April 2021, 16:42 mysqldump ist ein Programm und hat nichts mit der Shell zu tun.
Programme kann man auch in Python aufrufen: Stichwort subprocess.
okay habe das nun gefunden dazu:

Code: Alles auswählen

subprocess.Popen('mysqldump --user=username --password=passwd --databases mydb > test.sql')
mit dem Code bekomme ich immer ein Fehler..
weist du ob der Aufruf richtig ist ?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Keine Ahnung, du sagst ja nicht, was der Fehler ist.

Grunsätzlich ist die Anwendung von Popen in der Form aber falsch. Und das ">" ist die Umleitung der Standardausgabe in der Shell. Du willst und hast keine Shell, musst also stdout selbst asprechen.
Die Dokumentation für subprocess ist detailliert und hat alle nötigen Infos über die Anwendung.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Jetzt wäre es noch gut, zu wissen, welchen Fehler du bekommst.
Wenn Du nur ein Programm ausführen willst, dann benutze subprocess.run.
Auch sollte man nicht eine Shell zusätzlich starten, wenn es eigentlich gar nicht nötig ist.

Code: Alles auswählen

with open("test.sql", "wb") as output:
    subprocess.run(['mysqldump', '--user=username', '--password=passwd', '--databases', 'mydb'], stdout=output)
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Ich danke euch für die Hilfe,

das ist der Fehler:

Code: Alles auswählen

PermissionError: [Errno 1] Operation not permitted
Das Problem ist wie ich Python verwende und zwar auf einem IOS gerät mit der App Pythonista..
ich habe hier gerade nachgefragt woher das kommt und die meinten das

Code: Alles auswählen

 subprocess
nicht zu 100% unterstützt wird daher die Meldung egal was ich versucht hatte....

also muss ich nun die *.sql Datei selbst erstellen ohne mysqldump
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kalysto: Da würde ich von abraten, weil das nicht so einfach ist, wie das auf den ersten Blick aussieht, denn Du musst dafür sorgen, dass das für MySQL syntaktisch korrektes SQL ist. Also Tabellen- und Spaltennamen, sowie Werte entsprechend sicher escapen. `mysql.connector` hat da beispielsweise keine offizielle API für, weil Werte dort intern entsprechend behandelt werden. Das muss man als Nutzer von ”aussen” nicht machen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten