Datensatz bearbeiten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@Hyperion: Doch das sollte eigentlich automatisch gehen. Wenn die Datenbankspalte als DATETIME deklariert ist und da auch tatsächlich ein entsprechender Wert eingetragen wurde, dann sollte bei der Abfrage kein `str`-Objekt geliefert werden.
Ah ok... hab wohl zu lange nichts mehr mit der DB-API 2 gemacht :oops:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

Ich poste nochmal den aktuellen code

Code: Alles auswählen

from tkinter import *
import sqlite3
import time
import datetime

# sql
con = sqlite3.connect('pastedata.db')
cursor = con.cursor()
#TK
fenster = Tk()
title = fenster.title('Lötpastenkontrolle Version 0.2')

#von entry zu entry springen
def springen1(event):
    name.focus_set()

def springen2(event):
    datum_ablaufh.focus_set()

def springen3(event):
    abschicken.focus_set()

def springen4(event):
    seriennummer.focus_set()

#absenden der daten bei neuer paste
def senden():
    datum_k = datetime.datetime.now()
    datum_3 = datetime.datetime.now() + datetime.timedelta(days=3)
    datum_ab = datetime.datetime.now() + datetime.timedelta(hours=4)
    werte = (seriennummer.get(),
             name.get(),
             datum_k,
             datum_ablaufh.get(),
             datum_ab,
             datum_3,
             "",
             "")
    sql = "INSERT INTO paste VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
    cursor.execute(sql, werte)
    con.commit()
    seriennummer.delete('0',END)
    name.delete('0',END)
    datum_ablaufh.delete('0',END)
    seriennummer.focus_set()

def senden1():
    datum_o = datetime.datetime.now()
    datum_ende = datetime.datetime.now() + datetime.timedelta(hours=8)
    sn = seriennummer.get()
    datum_abb = "SELECT datum_ab FROM paste WHERE seriennummer=?"
    ergebnis = cursor.execute(datum_abb, sn)
    ergebnis1 = ergebnis.fetchone()
    werte1 = (datum_o, sn)
    werte2 = (datum_ende, sn)
    ok = "UPDATE paste SET datum_o=? WHERE seriennummer=?"
    ok2 = "UPDATE paste SET datum_ende=? WHERE seriennummer=?"
    a = ergebnis1[0]

    
    if datum_o <= a:
        cursor.execute(ok, werte1)
        cursor.execute(ok2, werte2)

#def ausgabe():
#    test = cursor.execute("""SELECT * FROM paste WHERE seriennummer=2""")
#    test1 = test.fetchall()
#    ausgabe1.config(text=test1)


seriennummer = Entry(fenster, font=('Arial', 30))
name = Entry(fenster, font=('Arial', 30))
datum_ablaufh = Entry(fenster, font=('Arial', 30))
#
Label(fenster, text="Seriennummer:").grid(column=0, row=0)
seriennummer.bind("<Return>", springen1)
seriennummer.focus_set()
seriennummer.grid(column=1, row=0)

Label(fenster, text="Name:").grid(column=0, row=1)
name.bind("<Return>", springen2)
name.grid(column=1, row=1)

Label(fenster, text="MHD Hersteller:").grid(column=0, row=2)
datum_ablaufh.bind("<Return>", springen3)
datum_ablaufh.grid(column=1, row=2)

abschicken = Button(master=fenster,
                    text="Neue Paste",
                    command=senden,
                    font=("Arial", 25))
abschicken.bind("<Return>", springen4)
abschicken.grid(column=1, row=3, sticky=W)

abschicken1 = Button(master=fenster,
                     text="Paste Öffnen",
                     command=senden1,
                     font=("Arial", 25))
abschicken1.grid(column=1, row=3, sticky=E)
#
#ausgabe1 = Label(master=fenster,
#                font=("Arial", 10),
#                text="Bitte Scannen")

#ausgabe1.grid(row=4)


fenster.mainloop()

Code: Alles auswählen

import sqlite3
import time

# Datenbank
con = sqlite3.connect('pastedata.db')
cursor = con.cursor()

print("Verbindung hergestellt...")


# Tabelle erstellen
#cursor.execute("""CREATE TABLE IF NOT EXISTS paste (
#        seriennummer TEXT PRIMARY KEY, datum_entnahme DATETIME, datum_ablaufh DATE, datum_3tage DATETIME, name TEXT, datum_oeffnung DATETIME, datum_ablauf DATETIME)""")
cursor.execute("""CREATE TABLE IF NOT EXISTS paste (
        seriennummer TEXT PRIMARY KEY,
        name TEXT,
        datum_k DATETIME,
        datum_h DATE,
        datum_ab DATETIME,
        datum_3 DATETIME,
        datum_o DATETIME,
        datum_ende DATETIME)"""
               )


print("Tabelle erstellt...")
con.close()
print("Verbindung geschlossen!")
BlackJack

@Hyperion: Wie peinlich, ich habe auch schon lange nichts mehr damit gemacht. Ich verwende immer SQLAlchemy. Man muss bei der Verbindung das Argument ``detect_types=True`` mitgeben, damit das funktioniert. :oops:
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

geht leider auch nicht

Code: Alles auswählen

con = sqlite3.connect('pastedata.db',
                      detect_types=True)
BlackJack

@Eisi: Bei mir geht das wenn die Spalte von Typ TIMESTAMP ist:

Code: Alles auswählen

In [24]: con = sqlite3.connect('test.db3', detect_types=True)

In [25]: cur = con.cursor()

In [26]: cur.execute('SELECT * FROM test')
Out[26]: <sqlite3.Cursor at 0xa4c1a60>

In [27]: cur.fetchall()
Out[27]: [(1, datetime.datetime(2014, 3, 14, 19, 59, 23, 672698))]
Ich fühle mich darin bestätigt SQLAlchemy zu verwenden. :-)
Eisi
User
Beiträge: 62
Registriert: Sonntag 24. November 2013, 21:59

Das war wohl der Fehler. Mit TIMESTAMP geht es einwand frei. Ich danke euch, nun kann ich endlich weiter machen :D
Antworten