Datei schreiben

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
linvris
User
Beiträge: 3
Registriert: Montag 17. März 2025, 13:46

mein eintrag in eine Tabelle,

Code: Alles auswählen

cur.execute("INSERT INTO tier (tier01, tier02, tier03) VALUES (%s, %s, %s)", (itier01, itier02, itier03))
db.commit()
ich möchte den oben stehen code in eine Datei schreiben

Code: Alles auswählen

datei = open('datei.txt','r+')
datei.write(into)
datei.close()
das wäre zum schreiben da, wie muß der inhalt aufgebaut sein ist meine vorlage so richtig ?
und wie kann ich ein unix timestamp zu meiner Datei ( unix timestamp-datei.txt )
into = "$eintragen = mysqli_query($link, "INSERT INTO tier (tier01, tier02, tier03) VALUES ('itier01', 'itier02', 'itier03')");"

1739746800 steht für 2025-02-17 als beispiel 1739746800-datei.txt
der timestamp braucht noch uhrzeit dazu
ich kann dann bei bedarf dei dateien sotieren anhand dem timestamp und dann soll eine phpscript den inhalt ausführen
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@linvris: Aus der Frage/den Fragen werde ich nicht schlau.

Der Datenbankentwurf sieht komisch aus. Eine Tabelle hat normalerweise nicht Spaltennamen die aus dem Tabellennamen und einer Nummer bestehen. Und auch Namen in Python sollten weder nummeriert sein, noch einen kryptischen Präfix (hier `i`) besitzen.

Der Dateimodus "r+" ist nur sehr selten das was man tatsächlich braucht. In dem Beispiel macht das "+" überhaupt keinen Sinn.

Statt `close()` selbst zu schreiben, würde man eher die ``with``-Anweisung verwenden, damit die Datei auf jeden Fall geschlossen wird.

Die ``into = …``-Zeile ist offensichtlich syntaktisch falsch weil die literale Zeichenkette die in " eingefasst ist, (ungeschützte) " enthält, was natürlich nicht geht. Der PHP-Code macht nicht das gleiche wie der Python-Code. Zum einen werden da die Namen aus dem Python-Code als Werte in die Tabelle eingetragen, was nicht wirklich Sinn macht. Und falls dort die *Werte* hinter den Namen stehen sollten, dann darf man die nicht einfach so in die Zeichenkette formatieren. Macht man in Python ja auch nicht. Das wäre in PHP dann eher

Code: Alles auswählen

$result = mysqli_execute_query(
    $link,
    'INSERT INTO tier (tier01, tier02, tier03) VALUES (?, ?, ?)',
    ['Wert von Tier 1', 'Wert von Tier 2', 'Wert von Tier 3']
);
Wobei man, wenn man diesen Code per Programm erzeugen wollte, wieder das Problem hat, dass man sicherstellen muss, das die Werte als syntaktisch korrektes PHP dort geschrieben werden — egal wie diese Werte aussehen!

Warum also so ein komischer Weg? Codeschnippsel als Dateien generieren und dann ausführen ist selten eine gute Idee. Zu umständlich, zu fehleranfällig, und auch nicht ganz ungefährlich. Es würde mehr Sinn machen die Werte in einem Standardformat zu speichern was Python schreiben und PHP lesen kann. Beispielsweise JSON.

Für Datumskram gibt es in Python das `datetime`-Modul.

Code: Alles auswählen

In [6]: int(datetime.datetime.now().timestamp())
Out[6]: 1742231955
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
linvris
User
Beiträge: 3
Registriert: Montag 17. März 2025, 13:46

ok mal anders erklären

Code: Alles auswählen

cur.execute("INSERT INTO tier (tier01, tier02, tier03) VALUES (%s, %s, %s)", (itier01, itier02, itier03))
db.commit()
das ist mein python code für DB eintrag
das itier habe ich gewählt (itier01 = "hund") damit ich weiß was meine einträge sind und anzahl auch weis sofort wen was nicht passt
das ist nicht das problem wo ich habe
unter php habe ich folgenden code

Code: Alles auswählen

$eintragen = mysqli_query($link, "INSERT INTO tier (tier01, tier02, tier03) VALUES ('itier01', 'itier02', 'itier03')");
zum eintragen in DB
es gibt 2 DB`s auf unterschiedlichen Computer. um nicht alles doppel zu schreiben wollte ich es mir vereinfachen
auf Computer 1 gibt einen webserver mit mysql und php ( internet )
auf Computer 2 gibt es auch einen webserver mit mariadb, php und python, sowie einen RFID Reader
der reader meine einträge in computer 2 DB über php kommen noch andere einträge dazu in verschiedene tabellen meistens ( ausnahme wären doppelte einträge oder token änderungen, was über php läuft (webseite))
ich möchte jetzt einträge wo python in DB macht in eine Datei schreiben, ich dachte daran das ich gleich eine fertige php zeile jedesmal habe bzw jedesmal eine neue datei welche ich ein datum als dateinamen mitgeben kann, wegen sortieren der unixtimestamp.damit ich dann die ältere dtei zuerst einlesen kann.

Code: Alles auswählen

In [6]: int(datetime.datetime.now().timestamp())
Out[6]: 1742231955
kan ich In[6]: und Out[6]: weglassen und rest nehmen, dazuu noch eine frage
was beinhaltet alles

Code: Alles auswählen

int(datetime.datetime.now().timestamp())
unter php kenne ich

Code: Alles auswählen

mktime(Stunde, Minute, Sekunde, Monat, Tag, Jahr)
und weiß wie ich ihn zerlegen kann.

wen ich es jetzt richtig verstanden habe sollte ich meine einträge wo ich unter python mache mit trenner dann in datei schreiben und dann später mit php auslesen und in db eintragen.
sehe ich das richtig so ?
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@linvris: Das erklärt jetzt nicht das kryptische `i` am Anfang der Namen, immer noch nicht warum die durchnummieriert sind, also was die *Bedeutung* der drei Zahlen ist, und der Tabellenname macht auch keinen Sinn, denn *ein* Tier besteht ja nicht aus drei Tieren‽

Der PHP-Code macht keinen Sinn, da drei Python-Variablennamen in die Datenbank einzutragen. Das macht ja nicht das gleiche wie der Python-Code *und* man würde das in PHP nicht so schreiben, dass man die Werte selber per Zeichenkettenoperationen in das SQL hinein bastelt. Das ist fehleranfällig bis gefährlich. Egal ob man das von PHP oder Python aus macht. Es ist auch unnötig umständlich aus Daten Quelltext zu generieren und zu speichern, statt die *Daten* zu speichern. Python kann JSON schreiben, PHP kann JSON lesen. Das ist sicherer sowohl was Fehler angeht, also auch was Angreifer angeht da nicht irgendwelchen generierten *Code* auszuführen. Also auch hier wieder nicht selber irgendwelche Zeichenketten mit Trennern basteln, sondern die entsprechenden Bibliotheken/Funktionen verwenden. In Python das `json`-Modul aus der Standardbibliothek und `json_decode()` in PHP.

Was ``int(datetime.datetime.now().timestamp())`` beinhaltet steht doch da alles. Alles was da steht ist dokumentiert. Und man kann das auch schrittweise in einer interaktiven Python-Shell mal ausprobieren.

Bei den Dateinamen würde ich nicht den Unix-Timestamp-Wert nehmen, sondern Zeit und Datum als ISO 8601-Format. Dann ist @linvris: Das erklärt jetzt nicht das kryptische `i` am Anfang der Namen, immer noch nicht warum die durchnummieriert sind, also was die *Bedeutung* der drei Zahlen ist, und der Tabellenname macht auch keinen Sinn, denn *ein* Tier besteht ja nicht aus drei Tieren‽

Der PHP-Code macht keinen Sinn, da drei Python-Variablennamen in die Datenbank einzutragen. Das macht ja nicht das gleiche wie der Python-Code *und* man würde das in PHP nicht so schreiben, dass man die Werte selber per Zeichenkettenoperationen in das SQL hinein bastelt. Das ist fehleranfällig bis gefährlich. Egal ob man das von PHP oder Python aus macht. Es ist auch unnötig umständlich aus Daten Quelltext zu generieren und zu speichern, statt die *Daten* zu speichern. Python kann JSON schreiben, PHP kann JSON lesen. Das ist sicherer sowohl was Fehler angeht, also auch was Angreifer angeht da nicht irgendwelchen generierten *Code* auszuführen. Also auch hier wieder nicht selber irgendwelche Zeichenketten mit Trennern basteln, sondern die entsprechenden Bibliotheken/Funktionen verwenden. In Python das `json`-Modul aus der Standardbibliothek und `json_decode()` in PHP.

Was ``int(datetime.datetime.now().timestamp())`` beinhaltet steht doch da alles. Alles was da steht ist dokumentiert. Und man kann das auch schrittweise in einer interaktiven Python-Shell mal ausprobieren.

Bei den Dateinamen würde ich nicht den Unix-Timestamp-Wert nehmen, sondern Zeit und Datum als ISO 8601-Format. Dann ist das gleichzeitig für Menschen leicht lesbar und kann als Text sortiert werden um die zeitliche Reihenfolge zu erhalten.

Wobei mir immer noch nicht ganz klar ist, warum das überhaupt als Dateien gespeichert werden muss, wenn man es doch gleich in die Datenbank eintragen könnte.
das gleichzeitig für Menschen leicht lesbar und kann als Text sortiert werden um die zeitliche Reihenfolge zu erhalten.

Wobei mir immer noch nicht ganz klar ist, warum das überhaupt als Dateien gespeichert werden muss, wenn man es doch gleich in die Datenbank eintragen könnte.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das ist alles ziemlich wirr... Kann es sein, dass das eigentlich Ziel ist, zwei Datenbanken synchron zu halten? Dafür gibt es fertige Mechanism bzw. Datenbanken. Die "größeren" SQL-Datenbanken kennen Master-Slave Replikation (oder wie auch immer das heute korrekt heißt), und z.B. CouchDB kennt Master-Master Replikation.

Gruß, noisefloor
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

und bei MySQL ist das wohl das Kapitel 19 Replication
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Was ist in dem Zug auch gelernt habe: MySQL kann auch Master-Master Replikation, aber scheinbar ohne Konfliktmanagement (was z.B. CouchDB hat), was IMHO die Nutzbarkeit einschränkt. PostgreSQL kann auch auch Master-Master Replikation, siehe https://www.postgresql.org/docs/current ... EPLICATION.

Gruß, noisefloor
linvris
User
Beiträge: 3
Registriert: Montag 17. März 2025, 13:46

Ich habe hier nichts mit Replikationen von DB zu tun, es würde auch nicht laufen.
ich mache einen umweg dafür
( alles sind nur vorlagen wo ich später mal verwenden möchte wenn ich alle teile zusammen setzen werde bis her ist es nur sammlung aber funktionell für sich )
mein code

Code: Alles auswählen

cur.execute("INSERT INTO iss (vsb01, vsb02, vsb03, vsb04, vsb05, vsb06, vsb07, vsb08, vsb09, vsb10) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", (ivsb01, ivsb02, ivsb03, ivsb04, ivsb05, ivsb06, ivsb07, ivsb08, ivsb09, ivsb10))
db.commit()

di = "|@|" + ivsb01 + "|@|" + ivsb02 + "|@|" + ivsb03 + "|@|" + ivsb04 + "|@|" + ivsb05 + "|@|" + ivsb06 + "|@|" + ivsb07 + "|@|" + ivsb08 + "|@|" + ivsb09 + "|@|" + ivsb10 + "/r"
                
fi = open("/pfad/ordner/" + uhrzeit +  "-" + datum + "import.txt", "a")
fi.write(di)
fi.close()
		
with open('/pfad/ordner/' + uhrzeit +  '-' + datum + 'import.txt', 'a') as fi:
f.write(di)
wie zu sehen gibt es ein tabellen eintrag, im anschluss habe ich mir einen Dateiinhalt erzeugen, welchen ich speichern möchte und später mit php einlesen und in tabelle hinzu fügen möchte.

Ist mein Code so verwendbar oder habe ich da noch eine denkfehler ? wenn ja bitte wo und wie lösen ?
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

Das wurde hier alles schon gesagt.
Wenn du die Hinweise doch gar nicht annehmen willst ä, macht doch die Frage in meinen Augen keine Sinn.

Verwende vernünftige Namen und ein robustes Format. Nicht so ein wildes, ausgedachtes Ding mit seltsamen Trennern für Feoder und Datensätze. Zum Beispiel JSON.

Zeichenketten stückelt man nicht mit + zusammen, sondern verwendet f-Strings.

Dateien öffnet man mit dem with-Statement.
Benutzeravatar
noisefloor
User
Beiträge: 4149
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich habe hier nichts mit Replikationen von DB zu tun, es würde auch nicht laufen.
Es würde nicht laufen, weil ...? Es ist zwar "modern" Behauptungen unbegründet ins Internet zu stellen, aber wenn du ernsthaft an Hilfe interessiert bis, dann bringt dich das so nicht weiter.

Und wenn dann am Ende Replikation nicht der Weg zum Ziel ist, dann würde ich nicht irgendwelche komischen Zeichenketten in komischen Formaten speichern, sondern alle SQL-Befehlszeilen von Datenbank A zusätzlich in eine Datei schreiben, die auf den Rechner mit Datenbank B übertragen und da ausführen. Und falls nötig umgekehrt. Wie du dann Konfliktmanagement implementierst hängt stark davon ab, welche Konflikte auftreten könnten.

Gruß, noisefloor
Sirius3
User
Beiträge: 18216
Registriert: Sonntag 21. Oktober 2012, 17:20

@linvris: wenn Du nicht Dein wirkliches Datenbank-Design hier posten willst, solltest Du wenigstens Namen verwenden, die unterscheidbar sind, so dass gar nicht erst der Verdacht aufkommt, dass Du hier wirklich etwas durchnummerierst.
Zum Speichern von Daten für den Datenaustausch benutzt man JSON. Die Sortierreihenfolge sollte datum-uhrzeit sein, oder möchtest Du erst alle Dateien die um 8 Uhr an einem beliebigen Tag entstanden sind einchecken und dann alle um 9?
Konfigurationsstrings, wie Ausgabepfade, schreibt man als Konstanten an den Anfang des Programms, damit man sie leicht wiederfindet.

Code: Alles auswählen

import datetime
import json
from pathlib import Path

OUTPUT_PATH = Path("/pfad/ordner")

...

entries = []
with contextlib.closing(db.cursor()) as cursor:
    cursor.execute("INSERT INTO foobar (foo, bar, baz) VALUES (%s, %s, %s)", (foo, bar, baz))
db.commit()

entries.append({"foo": foo, "bar": bar, "baz": baz})

now = datetime.datetime.now(tz=datetime.timezone.utc)
with (OUTPUT_PATH / f"{now:%Y-%m-%d_%H:%M:%S}_import.json").open("w") as file:
    json.dump(entries, file)
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn an eine Datei angehängt werden soll, dann wäre eventuell auch JSON-Lines ein passendes Format.
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
Antworten