hi Sirius
die ausgabe meines letzten postings wollte ich erreichen xD also geschaft hurra ich bin sogar etwas am feiern xD
ich wollte das table updaten ....um beim update nicht den alten und neuen bestand in einem zu haben, brauchte ich uniques... aber ueberaschung es gab gewollte duplikate ...
mit dem posting oben werden nun auch die duplikate mit eingetragen und alles ist updatefaehig. perfekt.
sqlite row unique moeglich?
- __blackjack__
- User
- Beiträge: 13107
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@pyront: Irgendwie ist das hier als Leser etwas frustrierend. Ich habe nicht verstanden was Du machen willst, Sirius3 auch nicht, und ich denke auch sonst niemand. Ich habe aber das Gefühl das es falsch gelöst ist, denn das sieht nach keinem gesunden Datenbankentwurf aus. Du hast das Problem was niemand hier kennt, immer nur in Form einer vermeintlichen Lösung beschrieben, die keiner hier versteht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@pyront: das was Du da gezeigt hast, hat nichts mit einer Datenbank zu tun, weil Du nur eine Handvoll Tuple erzeugst, wo die eine Hälfte der Elemente konstant ist, und die andere hochgezählt wird. Es ist schwer zu glauben, dass das die Lösung ist.
Um eine Datenbanktabelle zu aktualisieren, braucht man etwas, das einen Eintrag eindeutig identifiziert und einen Wert, der ersetzt werden soll. Laut erstem Beitrag sind das Datum, Name und Obstsorte. Aktualisiert werden könnte Obstanzahl. Die Spalten anzahl_genommen und anzahl_hinzugefügt lassen aber vermuten, dass die Tabelle gar keinen Zustand beschreiben soll, sondern Transaktionen. Butter und Milch sind zwei Felder, die gar nicht zum Rest passen
Um eine Datenbanktabelle zu aktualisieren, braucht man etwas, das einen Eintrag eindeutig identifiziert und einen Wert, der ersetzt werden soll. Laut erstem Beitrag sind das Datum, Name und Obstsorte. Aktualisiert werden könnte Obstanzahl. Die Spalten anzahl_genommen und anzahl_hinzugefügt lassen aber vermuten, dass die Tabelle gar keinen Zustand beschreiben soll, sondern Transaktionen. Butter und Milch sind zwei Felder, die gar nicht zum Rest passen
wow da bin ich baff deetz du hast mir 2x detailiert erklaert was sache ist und mir soagr die loesungsrichtungen gegeben ...
ich glaub ich weiss jetzt wo das problem ist du versucht der funktion tatsaechlichen sinn zu geben ... dabei ist es voellig egal ob es butter oder panzer sind.
ka ich hab den code mal versucht zu dokumentiern...
du kannst ihn ja mal testen und schauen was passiert wenn du den datensatz erweiterst und weitere duplikate einbaust.
ausgabe
ich glaub ich weiss jetzt wo das problem ist du versucht der funktion tatsaechlichen sinn zu geben ... dabei ist es voellig egal ob es butter oder panzer sind.
ka ich hab den code mal versucht zu dokumentiern...
du kannst ihn ja mal testen und schauen was passiert wenn du den datensatz erweiterst und weitere duplikate einbaust.
Code: Alles auswählen
import sqlite3
con = sqlite3.connect('testdb01.db3')
tname = 'te21'
#table zum befuellen erstellen
def erstelle_table_TakaTukaLand(tname):
with con:
cur = con.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS {} ( \
country_id INTEGER PRIMARY KEY, \
milch varchar[200], \
butter varchar[200], \
anzahl_genommen real, \
anzahl_hinzugefuegt real, \
obst_sorte varchar[200], \
obst_anzahl real, \
date_stamp text, \
name varchar[200], \
duplikat_gewollt_counter INTEGER, UNIQUE(milch, butter, anzahl_genommen, anzahl_hinzugefuegt, obst_sorte, obst_anzahl, date_stamp, name, duplikat_gewollt_counter) ON CONFLICT ABORT)" .format(tname))
erstelle_table_TakaTukaLand(tname)
#funktion zum befuellen des tables
def fill_ks_tab(milch='0', butter='0', anzahl_genommen=0, anzahl_hinzugefuegt=0, obst_sorte='0', obst_anzahl=0, date_stamp='0', name='0' ,duplikat_gewollt_counter=0):
with con:
talble_insert = tname
cur = con.cursor()
cur.execute("INSERT OR IGNORE into {} ( \
milch, \
butter, \
anzahl_genommen, \
anzahl_hinzugefuegt, \
obst_sorte, \
obst_anzahl, \
date_stamp, \
name, \
duplikat_gewollt_counter) \
values (?, ?, ?, ?, ?, ?, ?, ?, ?)" .format(talble_insert),( \
milch, \
butter, \
anzahl_genommen, \
anzahl_hinzugefuegt, \
obst_sorte, \
obst_anzahl, \
date_stamp, \
name, \
duplikat_gewollt_counter))
#fill_ks_tab()
# table am ende printen
def output_content(tname):
with con:
cur = con.cursor()
for row in cur.execute('select * from {};' .format(tname) ):
zeileintable = row
print (zeileintable)
#ab hier passiert die aktion
duplikat_gewollt_counter = 0
i = 0
#erzeuge 21 datensaetze
while i < 21:
#verschiedene datensaetze
milch='0'
butter='0'
anzahl_genommen=i
anzahl_hinzugefuegt=i
obst_sorte='0'
obst_anzahl=i
date_stamp='0'
name='0'
# jetzt duplikate erzeugen
if i == 3:
anzahl_genommen = i - 1
anzahl_hinzugefuegt = i - 1
obst_anzahl = i - 1
if i == 8:
anzahl_genommen = i - 1
anzahl_hinzugefuegt = i - 1
obst_anzahl = i - 1
if i == 12:
anzahl_genommen = i - 1
anzahl_hinzugefuegt = i - 1
obst_anzahl = i - 1
# ein doppeltes duplikat
if i == 13:
anzahl_genommen = i - 2
anzahl_hinzugefuegt = i - 2
obst_anzahl = i - 2
if i == 18:
anzahl_genommen = i - 1
anzahl_hinzugefuegt = i - 1
obst_anzahl = i - 1
# abfrage ob ein duplikat vorliegt
if i > 0 and bamilch==milch and babutter==butter and baanzahl_genommen==anzahl_genommen and baanzahl_hinzugefuegt==anzahl_hinzugefuegt and baobst_sorte==obst_sorte and baobst_anzahl==obst_anzahl and badate_stamp==date_stamp and baname==name:
# gib dem duplikat ein unterscheidungswert
duplikat_gewollt_counter += 1
# ist die duplikat reihe zu ende
else:
duplikat_gewollt_counter = 0
#werte ins table schreiben
fill_ks_tab(milch, butter, anzahl_genommen, anzahl_hinzugefuegt, obst_sorte, obst_anzahl, date_stamp, name, duplikat_gewollt_counter)
#werte speichern zum abgleich mit naechsten datensatz
bamilch=milch
babutter=butter
baanzahl_genommen=anzahl_genommen
baanzahl_hinzugefuegt=anzahl_hinzugefuegt
baobst_sorte=obst_sorte
baobst_anzahl=obst_anzahl
badate_stamp=date_stamp
baname=name
#neue runde
i += 1
output_content(tname)
Code: Alles auswählen
(1, '0', '0', 0.0, 0.0, '0', 0.0, '0', '0', 0)
(2, '0', '0', 1.0, 1.0, '0', 1.0, '0', '0', 0)
(3, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 0)
(4, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 1)
(5, '0', '0', 4.0, 4.0, '0', 4.0, '0', '0', 0)
(6, '0', '0', 5.0, 5.0, '0', 5.0, '0', '0', 0)
(7, '0', '0', 6.0, 6.0, '0', 6.0, '0', '0', 0)
(8, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 0)
(9, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 1)
(10, '0', '0', 9.0, 9.0, '0', 9.0, '0', '0', 0)
(11, '0', '0', 10.0, 10.0, '0', 10.0, '0', '0', 0)
(12, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(13, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 1)
(14, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 2)
(15, '0', '0', 14.0, 14.0, '0', 14.0, '0', '0', 0)
(16, '0', '0', 15.0, 15.0, '0', 15.0, '0', '0', 0)
(17, '0', '0', 16.0, 16.0, '0', 16.0, '0', '0', 0)
(18, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 0)
(19, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 1)
(20, '0', '0', 19.0, 19.0, '0', 19.0, '0', '0', 0)
(21, '0', '0', 20.0, 20.0, '0', 20.0, '0', '0', 0)
@pyront: wenn Du ein Feld `duplikat_gewollt_counter` nur deshalb hast, damit Du Duplikate in eine Tabelle schreiben kannst, dann kannst Du genausogut das UNIQUE weglassen, und wie __deets__ schon geschrieben hat, einfach mit einer eindeutigen ID arbeiten. Du suchst Duplikate auch nur, wenn der vorherige Datensatz in Deiner Schleife dem neuen entspricht. Das ist ja bei richtigen Daten nie der Fall. Somit benutzt die Datenbank eigentlich gar nicht.
Code: Alles auswählen
import sqlite3
def erstelle_table_TakaTukaLand(tname):
with con:
cur = con.cursor()
cur.execute("""CREATE TABLE kuehlschank (
country_id INTEGER PRIMARY KEY,
milch varchar[200],
butter varchar[200],
anzahl_genommen real,
anzahl_hinzugefuegt real,
obst_sorte varchar[200],
obst_anzahl real,
date_stamp timestamp,
name varchar[200]""")
def fill_kuehlschrank(con, milch='0', butter='0', anzahl_genommen=0, anzahl_hinzugefuegt=0, obst_sorte='0', obst_anzahl=0, date_stamp='0', name='0'):
with con:
cur = con.cursor()
cur.execute("""INSERT OR IGNORE into kuehlschank (
milch, butter, anzahl_genommen, anzahl_hinzugefuegt, obst_sorte,
obst_anzahl, date_stamp, name)
values (?, ?, ?, ?, ?, ?, ?, ?, ?)""", (
milch, butter, anzahl_genommen, anzahl_hinzugefuegt, obst_sorte,
obst_anzahl, date_stamp, name))
def output_content(con):
with con:
cur = con.cursor()
for row in cur.execute('select * from kuehlschank;'):
print(row)
def main():
con = sqlite3.connect('testdb01.db3')
erstelle_table_TakaTukaLand(tname)
for i in range(21):
if i in (3, 8, 12, 18):
fill_kuehlschrank(anzahl_genommen=i-1, anzahl_hinzugefuegt=i-1, obst_anzahl=i-1)
elif i in (13,):
fill_kuehlschrank(anzahl_genommen=i-1, anzahl_hinzugefuegt=i-1, obst_anzahl=i-1)
else:
fill_kuehlschrank(anzahl_genommen=i, anzahl_hinzugefuegt=i, obst_anzahl=i)
output_content(tname)
if __name__ == '__main__':
main()
wenn Du ein Feld `duplikat_gewollt_counter` nur deshalb hast, damit Du Duplikate in eine Tabelle schreiben kannst..
auf den punkt getroffen . (bzw schreiben und updaten[datensatz erweitern])
wie __deets__ schon geschrieben hat, einfach mit einer eindeutigen ID arbeiten.
es sagte auch das es nicht viel anders als meine loesung waere beide haetten das updateproblem
und wie ich schrieb viel mir keine loesung mit der eindeutigen id ein ....
...wenn der vorherige Datensatz in Deiner Schleife dem neuen entspricht. Das ist ja bei richtigen Daten nie der Fall.....
dann hab ich da einen denkfehler
ich dachte egal wie man daten anordnet, dass die duplikate immer zusammen stehen muessten ....weil sie ja gleich zum nachfolgendem sind
mir faellt auch kein bsp. ein wie das anders gehen wuerde ....
aber ja so simpel
edit schlimmsten typos
auf den punkt getroffen . (bzw schreiben und updaten[datensatz erweitern])
wie __deets__ schon geschrieben hat, einfach mit einer eindeutigen ID arbeiten.
es sagte auch das es nicht viel anders als meine loesung waere beide haetten das updateproblem
und wie ich schrieb viel mir keine loesung mit der eindeutigen id ein ....
...wenn der vorherige Datensatz in Deiner Schleife dem neuen entspricht. Das ist ja bei richtigen Daten nie der Fall.....
dann hab ich da einen denkfehler
ich dachte egal wie man daten anordnet, dass die duplikate immer zusammen stehen muessten ....weil sie ja gleich zum nachfolgendem sind
mir faellt auch kein bsp. ein wie das anders gehen wuerde ....
aber ja so simpel
edit schlimmsten typos
leider bekomm ich dein code nicht ausgefuert.....
aber ich liebe diese schreibweise, das wird wird sich ab jetzt aendern.
wenn ich dein code gedanklich durchgehe sehe ich nicht wie du das updateproblem geloest hast ... bei jeder neuen ausfuehrung wuerde sich dein datensatz zum alten hinzuaddieren.
aber ich liebe diese schreibweise, das wird wird sich ab jetzt aendern.
Code: Alles auswählen
cur.execute("""CREATE TABLE kuehlschank (
country_id INTEGER PRIMARY KEY,
milch varchar[200],
butter varchar[200],
anzahl_genommen real,
anzahl_hinzugefuegt real,
obst_sorte varchar[200],
obst_anzahl real,
date_stamp timestamp,
name varchar[200]""")
Daher ja meine Frage von vor zwei Posts: nach welchen Kriterien willst Du denn einen Datensatz ändern? Solange wir nicht wissen, wann ein Datensatz ein Duplikat sein soll und wann es zu einem Update führen soll, wird sich dieses Problem nicht lösen lassen.
- __blackjack__
- User
- Beiträge: 13107
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Sirius3's Code in lauffähig:
Ja, es werden Duplikate hinzugefügt. Und? Wo ist jetzt das Problem? Wenn Du wissen möchtest wie viele, dann kannst Du das mit `GROUP BY` und `count()` machen.
Wurde eigentlich schon mal erwähnt das die relationale Datenbank hier keinen Sinn zu machen scheint?
Was meinst Du mit „ich dachte egal wie man daten anordnet, dass die duplikate immer zusammen stehen muessten ....weil sie ja gleich zum nachfolgendem sind
mir faellt auch kein bsp. ein wie das anders gehen wuerde ....“? Ist das denn tatsächlich der Fall? Kann es bei Deinen Daten nie anders sein? Und wenn es anders ist, was soll dann passieren?
Bei Deinen Beiträgen ist es übrigens mühsam auseinanderzuhalten was Zitat und was Antwort ist.
Code: Alles auswählen
import sqlite3
def erstelle_table_takatukaland(con):
with con:
cur = con.cursor()
cur.execute("""CREATE TABLE kuehlschrank (
id INTEGER PRIMARY KEY,
milch varchar[200],
butter varchar[200],
anzahl_genommen real,
anzahl_hinzugefuegt real,
obst_sorte varchar[200],
obst_anzahl real,
date_stamp timestamp,
name varchar[200])""")
def fill_kuehlschrank(connection, milch='0', butter='0', anzahl_genommen=0,
anzahl_hinzugefuegt=0, obst_sorte='0', obst_anzahl=0, date_stamp='0',
name='0'
):
with connection:
cursor = connection.cursor()
cursor.execute("""INSERT into kuehlschrank (
milch, butter, anzahl_genommen, anzahl_hinzugefuegt, obst_sorte,
obst_anzahl, date_stamp, name)
values (?, ?, ?, ?, ?, ?, ?, ?)""", (
milch, butter, anzahl_genommen, anzahl_hinzugefuegt, obst_sorte,
obst_anzahl, date_stamp, name))
def output_content(connection):
with connection:
cursor = connection.cursor()
for row in cursor.execute('select * from kuehlschrank;'):
print(row)
def main():
connection = sqlite3.connect('test.db3')
erstelle_table_takatukaland(connection)
for i in range(21):
if i in (3, 8, 12, 18):
fill_kuehlschrank(connection, anzahl_genommen=i-1, anzahl_hinzugefuegt=i-1, obst_anzahl=i-1)
elif i in (13,):
fill_kuehlschrank(connection, anzahl_genommen=i-1, anzahl_hinzugefuegt=i-1, obst_anzahl=i-1)
else:
fill_kuehlschrank(connection, anzahl_genommen=i, anzahl_hinzugefuegt=i, obst_anzahl=i)
output_content(connection)
if __name__ == '__main__':
main()
Wurde eigentlich schon mal erwähnt das die relationale Datenbank hier keinen Sinn zu machen scheint?
Was meinst Du mit „ich dachte egal wie man daten anordnet, dass die duplikate immer zusammen stehen muessten ....weil sie ja gleich zum nachfolgendem sind
mir faellt auch kein bsp. ein wie das anders gehen wuerde ....“? Ist das denn tatsächlich der Fall? Kann es bei Deinen Daten nie anders sein? Und wenn es anders ist, was soll dann passieren?
Bei Deinen Beiträgen ist es übrigens mühsam auseinanderzuhalten was Zitat und was Antwort ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
also ich hab den alten datensatz erstellt mit while i < 21.... und erweiter ihn dann um sagen wir um while i < 45 und update mit diesen den alten 21 bestand.
es kommen also neue daten zum alten datensatz hinzu und ich muss nun entscheiden was neu, was alt ist.....
kein problem mit gewollten duplikaten__blackjack__ hat geschrieben: ↑Donnerstag 9. August 2018, 16:07 Ja, es werden Duplikate hinzugefügt. Und? Wo ist jetzt das Problem? Wenn Du wissen möchtest wie viele, dann kannst Du das mit `GROUP BY` und `count()` machen.
zumindest hoer ich das wort schon zum 2ten mal xD elationale Datenbank__blackjack__ hat geschrieben: ↑Donnerstag 9. August 2018, 16:07 Wurde eigentlich schon mal erwähnt das die relationale Datenbank hier keinen Sinn zu machen scheint?
es geht mir da nicht nur um meine daten. ich kann mir genrel kein datensatz ohne ordnung vorstellen....__blackjack__ hat geschrieben: ↑Donnerstag 9. August 2018, 16:07 Was meinst Du mit „ich dachte egal wie man daten anordnet, dass die duplikate immer zusammen stehen muessten ....weil sie ja gleich zum nachfolgendem sind
mir faellt auch kein bsp. ein wie das anders gehen wuerde ....“? Ist das denn tatsächlich der Fall? Kann es bei Deinen Daten nie anders sein? Und wenn es anders ist, was soll dann passieren?
nach irgentwas muss man doch immer etwas einordnen und wenn man 2 mal exakt das selbe hat wird das doch automatisch nebeneinander angeordnet
...wird sich dieses Problem nicht lösen lassen.
ist es doch schon oder ich denkfehler
hier mal 2 ausgaben von meinen prog mit und ohne unique
while bestand auf 46 erhoet mit duplicate check und uniques ---> gutes ergebniss
Code: Alles auswählen
(1, '0', '0', 0.0, 0.0, '0', 0.0, '0', '0', 0)
(2, '0', '0', 1.0, 1.0, '0', 1.0, '0', '0', 0)
(3, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 0)
(4, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 1)
(5, '0', '0', 4.0, 4.0, '0', 4.0, '0', '0', 0)
(6, '0', '0', 5.0, 5.0, '0', 5.0, '0', '0', 0)
(7, '0', '0', 6.0, 6.0, '0', 6.0, '0', '0', 0)
(8, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 0)
(9, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 1)
(10, '0', '0', 9.0, 9.0, '0', 9.0, '0', '0', 0)
(11, '0', '0', 10.0, 10.0, '0', 10.0, '0', '0', 0)
(12, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(13, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 1)
(14, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 2)
(15, '0', '0', 14.0, 14.0, '0', 14.0, '0', '0', 0)
(16, '0', '0', 15.0, 15.0, '0', 15.0, '0', '0', 0)
(17, '0', '0', 16.0, 16.0, '0', 16.0, '0', '0', 0)
(18, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 0)
(19, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 1)
(20, '0', '0', 19.0, 19.0, '0', 19.0, '0', '0', 0)
(21, '0', '0', 20.0, 20.0, '0', 20.0, '0', '0', 0)
(22, '0', '0', 21.0, 21.0, '0', 21.0, '0', '0', 0)
(23, '0', '0', 22.0, 22.0, '0', 22.0, '0', '0', 0)
(24, '0', '0', 23.0, 23.0, '0', 23.0, '0', '0', 0)
(25, '0', '0', 24.0, 24.0, '0', 24.0, '0', '0', 0)
(26, '0', '0', 25.0, 25.0, '0', 25.0, '0', '0', 0)
(27, '0', '0', 26.0, 26.0, '0', 26.0, '0', '0', 0)
(28, '0', '0', 27.0, 27.0, '0', 27.0, '0', '0', 0)
(29, '0', '0', 28.0, 28.0, '0', 28.0, '0', '0', 0)
(30, '0', '0', 29.0, 29.0, '0', 29.0, '0', '0', 0)
(31, '0', '0', 30.0, 30.0, '0', 30.0, '0', '0', 0)
(32, '0', '0', 31.0, 31.0, '0', 31.0, '0', '0', 0)
(33, '0', '0', 32.0, 32.0, '0', 32.0, '0', '0', 0)
(34, '0', '0', 33.0, 33.0, '0', 33.0, '0', '0', 0)
(35, '0', '0', 34.0, 34.0, '0', 34.0, '0', '0', 0)
(36, '0', '0', 35.0, 35.0, '0', 35.0, '0', '0', 0)
(37, '0', '0', 36.0, 36.0, '0', 36.0, '0', '0', 0)
(38, '0', '0', 37.0, 37.0, '0', 37.0, '0', '0', 0)
(39, '0', '0', 38.0, 38.0, '0', 38.0, '0', '0', 0)
(40, '0', '0', 39.0, 39.0, '0', 39.0, '0', '0', 0)
(41, '0', '0', 40.0, 40.0, '0', 40.0, '0', '0', 0)
(42, '0', '0', 41.0, 41.0, '0', 41.0, '0', '0', 0)
(43, '0', '0', 42.0, 42.0, '0', 42.0, '0', '0', 0)
(44, '0', '0', 43.0, 43.0, '0', 43.0, '0', '0', 0)
(45, '0', '0', 44.0, 44.0, '0', 44.0, '0', '0', 0)
und hier mal ohne uniques und ohne duplicate abfrage mit primary erst 21 dann auf 46 geupdatet --- > fehlerhaft
Code: Alles auswählen
1, '0', '0', 0.0, 0.0, '0', 0.0, '0', '0', 0)
(2, '0', '0', 1.0, 1.0, '0', 1.0, '0', '0', 0)
(3, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 0)
(4, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 0)
(5, '0', '0', 4.0, 4.0, '0', 4.0, '0', '0', 0)
(6, '0', '0', 5.0, 5.0, '0', 5.0, '0', '0', 0)
(7, '0', '0', 6.0, 6.0, '0', 6.0, '0', '0', 0)
(8, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 0)
(9, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 0)
(10, '0', '0', 9.0, 9.0, '0', 9.0, '0', '0', 0)
(11, '0', '0', 10.0, 10.0, '0', 10.0, '0', '0', 0)
(12, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(13, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(14, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(15, '0', '0', 14.0, 14.0, '0', 14.0, '0', '0', 0)
(16, '0', '0', 15.0, 15.0, '0', 15.0, '0', '0', 0)
(17, '0', '0', 16.0, 16.0, '0', 16.0, '0', '0', 0)
(18, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 0)
(19, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 0)
(20, '0', '0', 19.0, 19.0, '0', 19.0, '0', '0', 0)
(21, '0', '0', 20.0, 20.0, '0', 20.0, '0', '0', 0)
(22, '0', '0', 0.0, 0.0, '0', 0.0, '0', '0', 0)
(23, '0', '0', 1.0, 1.0, '0', 1.0, '0', '0', 0)
(24, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 0)
(25, '0', '0', 2.0, 2.0, '0', 2.0, '0', '0', 0)
(26, '0', '0', 4.0, 4.0, '0', 4.0, '0', '0', 0)
(27, '0', '0', 5.0, 5.0, '0', 5.0, '0', '0', 0)
(28, '0', '0', 6.0, 6.0, '0', 6.0, '0', '0', 0)
(29, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 0)
(30, '0', '0', 7.0, 7.0, '0', 7.0, '0', '0', 0)
(31, '0', '0', 9.0, 9.0, '0', 9.0, '0', '0', 0)
(32, '0', '0', 10.0, 10.0, '0', 10.0, '0', '0', 0)
(33, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(34, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(35, '0', '0', 11.0, 11.0, '0', 11.0, '0', '0', 0)
(36, '0', '0', 14.0, 14.0, '0', 14.0, '0', '0', 0)
(37, '0', '0', 15.0, 15.0, '0', 15.0, '0', '0', 0)
(38, '0', '0', 16.0, 16.0, '0', 16.0, '0', '0', 0)
(39, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 0)
(40, '0', '0', 17.0, 17.0, '0', 17.0, '0', '0', 0)
(41, '0', '0', 19.0, 19.0, '0', 19.0, '0', '0', 0)
(42, '0', '0', 20.0, 20.0, '0', 20.0, '0', '0', 0)
(43, '0', '0', 21.0, 21.0, '0', 21.0, '0', '0', 0)
(44, '0', '0', 22.0, 22.0, '0', 22.0, '0', '0', 0)
(45, '0', '0', 23.0, 23.0, '0', 23.0, '0', '0', 0)
(46, '0', '0', 24.0, 24.0, '0', 24.0, '0', '0', 0)
(47, '0', '0', 25.0, 25.0, '0', 25.0, '0', '0', 0)
(48, '0', '0', 26.0, 26.0, '0', 26.0, '0', '0', 0)
(49, '0', '0', 27.0, 27.0, '0', 27.0, '0', '0', 0)
(50, '0', '0', 28.0, 28.0, '0', 28.0, '0', '0', 0)
(51, '0', '0', 29.0, 29.0, '0', 29.0, '0', '0', 0)
(52, '0', '0', 30.0, 30.0, '0', 30.0, '0', '0', 0)
(53, '0', '0', 31.0, 31.0, '0', 31.0, '0', '0', 0)
(54, '0', '0', 32.0, 32.0, '0', 32.0, '0', '0', 0)
(55, '0', '0', 33.0, 33.0, '0', 33.0, '0', '0', 0)
(56, '0', '0', 34.0, 34.0, '0', 34.0, '0', '0', 0)
(57, '0', '0', 35.0, 35.0, '0', 35.0, '0', '0', 0)
(58, '0', '0', 36.0, 36.0, '0', 36.0, '0', '0', 0)
(59, '0', '0', 37.0, 37.0, '0', 37.0, '0', '0', 0)
(60, '0', '0', 38.0, 38.0, '0', 38.0, '0', '0', 0)
(61, '0', '0', 39.0, 39.0, '0', 39.0, '0', '0', 0)
(62, '0', '0', 40.0, 40.0, '0', 40.0, '0', '0', 0)
(63, '0', '0', 41.0, 41.0, '0', 41.0, '0', '0', 0)
(64, '0', '0', 42.0, 42.0, '0', 42.0, '0', '0', 0)
(65, '0', '0', 43.0, 43.0, '0', 43.0, '0', '0', 0)
(66, '0', '0', 44.0, 44.0, '0', 44.0, '0', '0', 0)
[/code]
Wie schon geschrieben, solange Du nur Dummy-Daten in einer while-Schleife (die eigentlich eine for-Schleife sein sollte) erzeugst, wirst Du Deinen Denkfehler auch nicht finden. In Realität hast Du einen Sack mit bunten Würfeln und Kugeln und ziehst daraus blind. Dann fügst Du Deiner Datenbank rote Kugel, blauer Würfel, blaue Kugel, rote Kugel hinzu. Niemand garantiert Dir, dass Du zuerst alle roten Kugeln, und dann alle blauen Würfel ziehst.
Natuerlich bringt man auch ungeordnete Daten dadurch, dass man sie zB ausgibt, in eine Ordnung. Nur ist die nicht wohldefiniert. Sondern haengt bestenfalls von impliziten Eigenschaften ab, wie in deinem Fall - weil du irgendetwas irgendwie hochzaehlst, und dann daraus resultierend die Daten erzeugst.
Aber es ist eine gefaehrlicher Fehler das zu generalisieren. Deine Datenbank zB speichert die von dir angegeben Eintraege IRGENDWIE ab. Zb nach Verfuegbarkeit von irgendwelchen Datenbloecken in einer Datei. Und wenn die da wieder rausgeholt werden, dann moegen die in *irgendeiner* Reihenfolge zurueck kommen, und dann was? Und wenn die Daten in der Datenbank veraendert werden (also ein echtes UPDATE, kein INSERT IGNORE), dann werden die ggf. nicht an die gleiche Stelle geschrieben, und kommen NOCHMAL anders zurueck.
Wenn die Erzeugung deiner Daten, die du hier darstellst, immer gleich bleibt, und du da peinlich genau drauf achtest, dann kannst du einfach deine Laufvariable i mit in die Datenbank packen, und dann hast du eine ID. Bei der Abfrage kannst du zB danach sortieren, und dann bekommst du die auch genau in der Reihenfolge, in der du sie eingegeben hast.
Was die ganze Uebung nun aber soll, wenn dein ganzen Denken darum kreist, dass du diesen Code laufen laesst, der sowieso immer die gleichen Daten erzeugt, das erschliesst sich mir nicht. Wozu eine Datenbank, wenn die Daten eh immer erzeugt werden koennen? Das ist doch nur Verschwendung von Zeit und Platz. Ohne deinen Code ist die DB ja wertlos.
Aber es ist eine gefaehrlicher Fehler das zu generalisieren. Deine Datenbank zB speichert die von dir angegeben Eintraege IRGENDWIE ab. Zb nach Verfuegbarkeit von irgendwelchen Datenbloecken in einer Datei. Und wenn die da wieder rausgeholt werden, dann moegen die in *irgendeiner* Reihenfolge zurueck kommen, und dann was? Und wenn die Daten in der Datenbank veraendert werden (also ein echtes UPDATE, kein INSERT IGNORE), dann werden die ggf. nicht an die gleiche Stelle geschrieben, und kommen NOCHMAL anders zurueck.
Wenn die Erzeugung deiner Daten, die du hier darstellst, immer gleich bleibt, und du da peinlich genau drauf achtest, dann kannst du einfach deine Laufvariable i mit in die Datenbank packen, und dann hast du eine ID. Bei der Abfrage kannst du zB danach sortieren, und dann bekommst du die auch genau in der Reihenfolge, in der du sie eingegeben hast.
Was die ganze Uebung nun aber soll, wenn dein ganzen Denken darum kreist, dass du diesen Code laufen laesst, der sowieso immer die gleichen Daten erzeugt, das erschliesst sich mir nicht. Wozu eine Datenbank, wenn die Daten eh immer erzeugt werden koennen? Das ist doch nur Verschwendung von Zeit und Platz. Ohne deinen Code ist die DB ja wertlos.
ist doch mit der funktion auch kein problem, insert blauer wuerfel, insert roter wuerfel, insert roter wuerfel counter_gewolltes duplikat +1 , insert gruener wurfel ..... etcSirius3 hat geschrieben: ↑Donnerstag 9. August 2018, 16:52 Wie schon geschrieben, solange Du nur Dummy-Daten in einer while-Schleife (die eigentlich eine for-Schleife sein sollte) erzeugst, wirst Du Deinen Denkfehler auch nicht finden. In Realität hast Du einen Sack mit bunten Würfeln und Kugeln und ziehst daraus blind. Dann fügst Du Deiner Datenbank rote Kugel, blauer Würfel, blaue Kugel, rote Kugel hinzu. Niemand garantiert Dir, dass Du zuerst alle roten Kugeln, und dann alle blauen Würfel ziehst.
diese impliziten Eigenschaften wuerden dann doch die ordnung bestimmen ? und gleiches zu gleichem packen ?
damit hast du natuerlich recht und
ja ich koennte tatsaechlich irgentwas erfinden nur mit dem ziel das diese funktuion nicht funktioniert.... aber ich glaube das kommt im realen leben nicht vor .... keine ahnung
oha da muss ich mal drueber nachdenken....__deets__ hat geschrieben: ↑Donnerstag 9. August 2018, 16:53 Deine Datenbank zB speichert die von dir angegeben Eintraege IRGENDWIE ab. Zb nach Verfuegbarkeit von irgendwelchen Datenbloecken in einer Datei. Und wenn die da wieder rausgeholt werden, dann moegen die in *irgendeiner* Reihenfolge zurueck kommen, und dann was? Und wenn die Daten in der Datenbank veraendert werden (also ein echtes UPDATE, kein INSERT IGNORE), dann werden die ggf. nicht an die gleiche Stelle geschrieben, und kommen NOCHMAL anders zurueck.
eine gute idee finde ich.__deets__ hat geschrieben: ↑Donnerstag 9. August 2018, 16:53 Wenn die Erzeugung deiner Daten, die du hier darstellst, immer gleich bleibt, und du da peinlich genau drauf achtest, dann kannst du einfach deine Laufvariable i mit in die Datenbank packen, und dann hast du eine ID. Bei der Abfrage kannst du zB danach sortieren, und dann bekommst du die auch genau in der Reihenfolge, in der du sie eingegeben hast.
was wenn die db 5 mio eintraege hat... vor jeder abfrage 5 mio eintrage erstellen ?
ich liebe sqlite weil ich dort daten speichern kann die nach dem program ende noch erhalten bleiben, weil suchvorgaenge komfortabel und wahnsinnig schnell sind.
Du mußt ja gar keine 5 millionen Einträge speichern, weil der 4982345te Eintrag einfach
ist.
Du hast mein Beispiel ja verdreht. Die Reihenfolge war rote Kugel, blauer Würfel, blaue Kugel, rote Kugel und da ist der Eintrag vor der zweiten roten Kugel eine blaue Kugel und damit erkennt Dein Algorithmus eben nicht das Duplikat.
Code: Alles auswählen
(4982345, '0', '0', 4982344.0, 4982344.0, '0', 4982344.0, '0', '0', 0)
Du hast mein Beispiel ja verdreht. Die Reihenfolge war rote Kugel, blauer Würfel, blaue Kugel, rote Kugel und da ist der Eintrag vor der zweiten roten Kugel eine blaue Kugel und damit erkennt Dein Algorithmus eben nicht das Duplikat.
Ich moechte mal sehen, wie du Code schreibst, der 5 Millionen Eintraege auf die Art generiert, wie du es jetzt tust, und dabei nicht hochgradig redundante Daten erzeugt. Oder zufaellige.
Und das ist des Pudels Kern: was du machst, hat bisher immer noch niemand verstanden. Wozu diese komischen Daten generieren? Natuerlich kann ich
daten = [(i, "takatukaland) for i in range(5000_000)]
machen. Dann habe ich halt 5 Millionen mal das Land Takatukaland identifizierbar gemacht. Warum nun aber genau das 342312 davon irgendwie manipuliert werden will, und in Tokotokaland umbenannt werden muss, erschliesst sich mir nicht.
Zusammengefasst kann diese ganze Konversation so werden: eine Datenbank garantiert dir nicht, das Daten in einer bestimmten Reihenfolge abgespeichert werden. Wenn du eine stabile Ordnung willst, kannst du die erzeugen, indem du die Erzeugungsreihenfolge benutzt. Explizit, indem du einfach die laufende Nummer davor stellst, oder primary key int verwendest. Und beim abfragen musst du dich darauf beziehen, und zB nach dem Key sortieren.
Und das ist des Pudels Kern: was du machst, hat bisher immer noch niemand verstanden. Wozu diese komischen Daten generieren? Natuerlich kann ich
daten = [(i, "takatukaland) for i in range(5000_000)]
machen. Dann habe ich halt 5 Millionen mal das Land Takatukaland identifizierbar gemacht. Warum nun aber genau das 342312 davon irgendwie manipuliert werden will, und in Tokotokaland umbenannt werden muss, erschliesst sich mir nicht.
Zusammengefasst kann diese ganze Konversation so werden: eine Datenbank garantiert dir nicht, das Daten in einer bestimmten Reihenfolge abgespeichert werden. Wenn du eine stabile Ordnung willst, kannst du die erzeugen, indem du die Erzeugungsreihenfolge benutzt. Explizit, indem du einfach die laufende Nummer davor stellst, oder primary key int verwendest. Und beim abfragen musst du dich darauf beziehen, und zB nach dem Key sortieren.
wie kannst du aus einem sack ziehen und dann in die vergangenheit reisen um vor der kugel eine andere zu ziehen ....Sirius3 hat geschrieben: ↑Donnerstag 9. August 2018, 17:54 Du mußt ja gar keine 5 millionen Einträge speichern, weil der 4982345te Eintrag einfachist.Code: Alles auswählen
(4982345, '0', '0', 4982344.0, 4982344.0, '0', 4982344.0, '0', '0', 0)
Du hast mein Beispiel ja verdreht. Die Reihenfolge war rote Kugel, blauer Würfel, blaue Kugel, rote Kugel und da ist der Eintrag vor der zweiten roten Kugel eine blaue Kugel und damit erkennt Dein Algorithmus eben nicht das Duplikat.
achwas bei 4,9 mio hoerts bei sqlite auf ... schade wird aber sicher reichen ...
5mio daten kein..... problem frag das wetter alle 0.000001 sekunden ab und speicher den wert mit der funktion in nem table
falls du noch die nerven hast xD mich interessiert wirklich wo die grenzen liegen...
ich glaub das ist ein guter punkt und eine echte einschraenkung der funktion, die quelle muss stabil sein...
faellt mir kein guter grund ein warum ich die daten veraendern sollte, aber ja auch das waere ein fail
besser waere es das table zu kopieren und dann aenderungen vornehmen...
order gleich die aenderungen in ein neues table zu schreiben.
meinst du wenn die quelle der daten veraendert wird ?__deets__ hat geschrieben: ↑Donnerstag 9. August 2018, 16:53 Deine Datenbank zB speichert die von dir angegeben Eintraege IRGENDWIE ab. Zb nach Verfuegbarkeit von irgendwelchen Datenbloecken in einer Datei.
Und wenn die da wieder rausgeholt werden, dann moegen die in *irgendeiner* Reihenfolge zurueck kommen, und dann was?
ich glaub das ist ein guter punkt und eine echte einschraenkung der funktion, die quelle muss stabil sein...
du meinst wenn ich die rohdaten in dem table aendern sollte?
faellt mir kein guter grund ein warum ich die daten veraendern sollte, aber ja auch das waere ein fail
besser waere es das table zu kopieren und dann aenderungen vornehmen...
order gleich die aenderungen in ein neues table zu schreiben.
Du hast wirklich ein völlig falsches Bild, was eine Datenbank ist und wie man sie benutzt.
Versuch mal zu erklären, was Dein eigentliches Problem ist.
Zu erzählen, wie Deine Lösung aussieht, zu einem Problem, das wir nicht kennen, hilft dagegen nicht.
Versuch mal zu erklären, was Dein eigentliches Problem ist.
Zu erzählen, wie Deine Lösung aussieht, zu einem Problem, das wir nicht kennen, hilft dagegen nicht.