sqlite row unique moeglich?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

oje das wollt ich nicht...
ich glaub das ziel war zu simple, sodass ihr es garnicht anerkennt :(

ein table updaten das duplikate enthaellt und erhaelt updaten.... mehr nicht
ich glaub __deets__ hat es verstanden
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nein, verstanden habe ich das auch nicht.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

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.

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)



ausgabe

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)

Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

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
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

leider bekomm ich dein code nicht ausgefuert.....
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]""")
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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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

Sirius3's Code in lauffähig:

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()
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

Sirius3 hat geschrieben: Donnerstag 9. August 2018, 16:05 Daher ja meine Frage von vor zwei Posts: nach welchen Kriterien willst Du denn einen Datensatz ändern?
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.....

__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.
kein problem mit gewollten duplikaten


__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?
zumindest hoer ich das wort schon zum 2ten mal xD elationale Datenbank


__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?
es geht mir da nicht nur um meine daten. ich kann mir genrel kein datensatz ohne ordnung vorstellen....
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]
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

Sirius3 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.
ist doch mit der funktion auch kein problem, insert blauer wuerfel, insert roter wuerfel, insert roter wuerfel counter_gewolltes duplikat +1 , insert gruener wurfel ..... etc
__deets__ hat geschrieben: Donnerstag 9. August 2018, 16:53 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,
diese impliziten Eigenschaften wuerden dann doch die ordnung bestimmen ? und gleiches zu gleichem packen ?
__deets__ hat geschrieben: Donnerstag 9. August 2018, 16:53 Aber es ist eine gefaehrlicher Fehler das zu generalisieren.
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
__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.
oha da muss ich mal drueber nachdenken....
__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.
eine gute idee finde ich.
__deets__ hat geschrieben: Donnerstag 9. August 2018, 16:53 Wozu eine Datenbank, wenn die Daten eh immer erzeugt werden koennen?
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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt ja gar keine 5 millionen Einträge speichern, weil der 4982345te Eintrag einfach

Code: Alles auswählen

(4982345, '0', '0', 4982344.0, 4982344.0, '0', 4982344.0, '0', '0', 0)
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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

Sirius3 hat geschrieben: Donnerstag 9. August 2018, 17:54 Du mußt ja gar keine 5 millionen Einträge speichern, weil der 4982345te Eintrag einfach

Code: Alles auswählen

(4982345, '0', '0', 4982344.0, 4982344.0, '0', 4982344.0, '0', '0', 0)
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.
wie kannst du aus einem sack ziehen und dann in die vergangenheit reisen um vor der kugel eine andere zu ziehen ....

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
pyront
User
Beiträge: 22
Registriert: Donnerstag 28. Juni 2018, 16:04

falls du noch die nerven hast xD mich interessiert wirklich wo die grenzen liegen...
__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?
meinst du wenn die quelle der daten veraendert wird ?
ich glaub das ist ein guter punkt und eine echte einschraenkung der funktion, die quelle muss stabil sein...
__deets__ hat geschrieben: Donnerstag 9. August 2018, 16:53 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.
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.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Antworten