Aktulisierungsabfrage

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

Aktulisierungsabfrage

Beitragvon oshoki » Donnerstag 13. November 2008, 22:13

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Aktulisierungsabfrage

Beitragvon gerold » Donnerstag 13. November 2008, 23:02

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=]UPDATE Tabelle1 SET Tabelle1.Feld1 = SUBSTR(Tabelle1.Feld, 1, 8)[/code]
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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Aktulisierungsabfrage

Beitragvon gerold » Donnerstag 13. November 2008, 23:09

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=](u'asdfasdfasdfasdf',)
(u'jjjjjjjjjjjjjjjj',)
(u'uuuuuuuuuuuuuuuu',)
(u'asd',)
(u'jjj',)
(u'uuu',)[/code]
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

Beitragvon oshoki » Freitag 14. November 2008, 06:43

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

Beitragvon n4p » Freitag 14. November 2008, 13:01

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 14. November 2008, 13:13

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=]LEFT(feldname, 2) --> SUBSTR(feldname, 1, 2)
RIGHT(feldname, 2) --> SUBSTR(feldname, -2)[/code]
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

Beitragvon oshoki » Freitag 14. November 2008, 15:03

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

Beitragvon oshoki » Freitag 14. November 2008, 16:03

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 14. November 2008, 18:10

http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder