Aktulisierungsabfrage

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
oshoki
User
Beiträge: 30
Registriert: Donnerstag 3. Januar 2008, 22:49

Ich würde gern wissen, wie man eine Aktualisierungsabfrage in Python für Sqlite realisieren kann.
In Access sieht das so aus

Code: Alles auswählen

UPDATE Tabelle1 SET Tabelle1.Feld1 = Left([Feld1];8)
Bedeutet also, ich möchte in allen Eintragungen in Feld1 in der Tabelle1 die Inhalte auf 8 Zeichen reduzieren.
Freue mich auf jede Idee, wie das in Python aussehen kann
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

oshoki hat geschrieben:

Code: Alles auswählen

UPDATE Tabelle1 SET Tabelle1.Feld1 = Left([Feld1];8)
Hallo oshoki!

Vielleicht kannst du mit der substr()-Funktionarbeiten.

Dann könnte das vielleicht so aussehen:

Code: Alles auswählen

UPDATE Tabelle1 SET Tabelle1.Feld1 = SUBSTR(Tabelle1.Feld, 1, 8)
Mal ausprobieren...

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

gerold hat geschrieben:Mal ausprobieren...

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import sqlite3

conn = sqlite3.connect(":memory:")
sql = """
CREATE TABLE test (
  id INTEGER PRIMARY KEY,
  Feld1 text
)
"""
conn.execute(sql)
conn.commit()

sql = """
INSERT INTO test (
  Feld1
) VALUES (
  ?
)
"""
conn.executemany(
    sql, [
        [u"asdfasdfasdfasdf"],
        [u"jjjjjjjjjjjjjjjj"],
        [u"uuuuuuuuuuuuuuuu"],
    ]
)
conn.commit()

sql = """
SELECT 
  Feld1 
FROM 
  test
"""
cur = conn.cursor()
cur.execute(sql)
for row in cur:
    print row

sql = """
UPDATE 
  test 
SET
  Feld1 = SUBSTR(Feld1, 1, 3)  
"""
conn.execute(sql)
conn.commit()

sql = """
SELECT 
  Feld1 
FROM 
  test
"""
cur = conn.cursor()
cur.execute(sql)
for row in cur:
    print row
Ja, funktioniert!

Code: Alles auswählen

(u'asdfasdfasdfasdf',)
(u'jjjjjjjjjjjjjjjj',)
(u'uuuuuuuuuuuuuuuu',)
(u'asd',)
(u'jjj',)
(u'uuu',)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
oshoki
User
Beiträge: 30
Registriert: Donnerstag 3. Januar 2008, 22:49

Super, das bringt mich auf die Idee, ob

Code: Alles auswählen

sql = """
UPDATE
  test
SET
  Feld1 = left(Feld1, 2)
"""
auch funktionieren könnte. Leider Fehlanzeige

Vielen Dank für die schnelle Antwort und schöne Grüße an den grünen Inn
n4p
User
Beiträge: 55
Registriert: Dienstag 10. Juni 2008, 11:05

Müsste doch dann laut gerolds Beispiel auch

Code: Alles auswählen

sql = """ 
UPDATE 
  test 
SET 
  Feld1 = SUBSTR(Feld1, 1, 2)  
"""
lauten oder?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

LEFT und RIGHT sind unnötige Funktionen. Die von LEFT und RIGHT erwarteten Ergebnisse lassen sich ohne Mehraufwand mit SUBSTR erzielen.

http://www.sqlite.org/lang_corefunc.html#substr

Code: Alles auswählen

LEFT(feldname, 2) --> SUBSTR(feldname, 1, 2)
RIGHT(feldname, 2) --> SUBSTR(feldname, -2)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
oshoki
User
Beiträge: 30
Registriert: Donnerstag 3. Januar 2008, 22:49

substr funktioniert super.
Damit konnte ich wunderbar die Zeit vom Datum im string abtrennen. Doch steht der string für deutsches Datumsformat TT.MM.JJJ und sollte YYYY-MM-DD in meiner DB stehen. Sonst kann ich mit SQlite ganz offensichtlich nicht rechnen und es gehen nur explizite string-Vergleiche. Mit Between und <> ist nichts.

Wie kann ich denn die einzelnen Substr-Ausdrücke in einem UPDATE aneinanderreihen und auch noch mit einem "-" trennen? Mit dem + geht es offensichtlich nicht.
oshoki
User
Beiträge: 30
Registriert: Donnerstag 3. Januar 2008, 22:49

Ich hab doch noch etwas gefunden. Da das Aneinanderreihen von substr und anderen strings beim set für update mit + nicht funktioniert, sollte ein anderer Befehl dazu dienen. Bei MySQL ist das concat. Bei SQLite ist das das Pipe-Zeichen ||.
Hier ist der Test in Anlehnung an Gerolds Vorarbeit:

Code: Alles auswählen

import sqlite3
conn = sqlite3.connect(":memory:")
sql = """
CREATE TABLE test (
  id INTEGER PRIMARY KEY,
  datum text
)
"""
conn.execute(sql)
conn.commit()

sql = """
INSERT INTO test (
  datum
) VALUES (
  ?
)
"""
conn.executemany(
    sql, [
        [u"01.01.2008"],
        [u"15.06.1969"],
        [u"14.11.1998"],
    ]
)
conn.commit()

sql = """
UPDATE test
       SET datum = SUBSTR(datum, 7, 4)
       || '-' ||
       SUBSTR(datum, 4,2)
       || '-' ||
       SUBSTR(datum, 1,2)
"""
conn.execute(sql)
conn.commit()

sql = """
SELECT
  datum
FROM
  test
"""

cur = conn.cursor()
cur.execute(sql)
conn.commit()

for row in cur:
    print row
Heraus kommt dann:

Code: Alles auswählen

>>> 
(u'2008-01-01',)
(u'1969-06-15',)
(u'1998-11-14',)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten