Seite 1 von 1

letzten Eintrag einer Datenbank auslesen(?!) SQLite!!

Verfasst: Freitag 27. April 2007, 21:11
von cyp++
Hi,

zuerst die Methode um die es hier geht =>

Code: Alles auswählen

def computeWeightDifference(self):

		# connect to DATABASE
		connection = sqlite.connect("E:\Schule\Programmieren\WeightWatcher\WeightWatcher.db", isolation_level = None)

		# read last entered weight
		cursor = connection.cursor()
		lastentry = cursor.execute("SELECT weight FROM WeightWatcher ORDER BY id DESC LIMIT 1")
		print lastentry
ich möchte den letzten Eintrag in der Spalte "weight" auslesen um damit weiterarbeiten zu können, aber irgendwie funktioniert das nicht, da kommt sowas wie "sqlite3.Cursor object at 0x009ED4d0" Wie mache ich das richtig?

mfg

Verfasst: Freitag 27. April 2007, 21:27
von jens
Du machst erst eine cursor.execute() und das Ergebnis bekommst du mit cursor.fetchall() (oder fetschone)...

Verfasst: Freitag 27. April 2007, 21:29
von Sr4l
print lastentry.fetchall()

versuchs mal damit ;-)

**edit** a zulang gebraucht ;-)

Re: letzten Eintrag einer Datenbank auslesen(?!) SQLite!!

Verfasst: Freitag 27. April 2007, 21:33
von gerold
Hallo cyp++!

Nur mal so nebenbei gesagt:

"E:\Schule\Programmieren\WeightWatcher\WeightWatcher.db" ist der Pfad zu deiner Datenbank. "WeightWatcher.db" ist deine Datenbank.

"WeightWatcher" ist eine Tabelle. Du möchtest also auf den letzten Datensatz der Tabelle "WeightWatcher" zugreifen.

Es ist eine gute Idee, die Tabellennamen klein, ohne Leer- oder Sonderzeichen zu schreiben und der Tabelle einen Namen zu verpassen, der aussagt was in der Tabelle zu finden ist. Da in deiner Tabelle sicher keine "WeightWatcher" zu finden sind ;-) würde ich als Namen z.B. "weight" oder "weights" vorschlagen.

mfg
Gerold
:-)

Verfasst: Sonntag 29. April 2007, 13:30
von cyp++
lastentry.fetchone()[0]
gibt mir den letzten Wert zurück- alles richtig soweit! doch nach
type(lastentry.fetchone()[0])
bekomme ich 'unicode' zurück und damit kann ich nicht arbeiten, mit int() kann ich das komischerweise auch nicht umwandeln :( Wer kann mir helfen?

Verfasst: Sonntag 29. April 2007, 14:23
von BlackJack
Das kann nicht sein:

Code: Alles auswählen

In [16]: a = u'42'

In [17]: type(a)
Out[17]: <type 'unicode'>

In [18]: int(a)
Out[18]: 42
Also was steht denn nun genau in der Datenbank?

Verfasst: Sonntag 29. April 2007, 14:49
von cyp++
kann es sein, dass fetchone() sich immer die stelle merkt wo es zuletzt war und dann da weitermacht, so wie read() ?

Verfasst: Sonntag 29. April 2007, 15:15
von BlackJack
Natürlich, sonst könnte man es ja nicht in einer Schleife benutzen.

Verfasst: Sonntag 29. April 2007, 15:19
von cyp++
das klärt natürlich so einiges..da ich in

Code: Alles auswählen

self.difference = int(lastentry.fetchone()[0])/100 * int(lastentry.fetchone())[0]-int(self.weight)
gleich 2x darauf zugreife.. wie könnte ich es realisieren? Das erklärt auch warum da ein None zurückkommt beim 2. Ausdruck.. und NoneType kann man natürlich nicht in ein integer umwandeln.

Verfasst: Sonntag 29. April 2007, 16:06
von BlackJack
Der offensichtlich einfachste Weg wäre es, das Ergebnis an einen Namen zu binden und den in der Rechnung zu verwenden.

Verfasst: Sonntag 29. April 2007, 17:31
von cyp++

Code: Alles auswählen

# WeightWatcher.py

import time
try:
    from pysqlite2 import dbapi2 as sqlite
except:
    from sqlite3 import dbapi2 as sqlite

class WeightWatcher(object):

	def __init__(self, weight):

		self.weight = weight

		self.difference = None
		self.date = None

	def writeIntoDatabase(self):

		# date
		self.date = str(time.localtime()[2]) + "." + str(time.localtime()[1]) + "." + str(time.localtime()[0])

		try:
			# connect to DATABASE
			connection = sqlite.connect("E:\Schule\Programmieren\WeightWatcher\WeightWatcher.db", isolation_level = None)

			# write into DATABASE
			cursor = connection.cursor()
			cursorparam = """INSERT INTO WeightWatcher VALUES(NULL, "%s", "%s", "%s")""" % (self.date, self.weight, self.difference)
			cursor.execute(cursorparam)
		except:
			print "Error"


	def computeWeightDifference(self):

		try:
			# connect to DATABASE
			connection = sqlite.connect("E:\Schule\Programmieren\WeightWatcher\WeightWatcher.db", isolation_level = None)

			# read last entered weight
			cursor = connection.cursor()
			lastentry = cursor.execute("SELECT weight FROM WeightWatcher ORDER BY id DESC LIMIT 1")

			try:
				ff = int(lastentry.fetchone()[0])
				self.difference = (float(ff/100)) * (ff-int(self.weight))
			except TypeError:
				ff = 0
			print self.difference
		except:
			print "Error!"

	def createDatabase(self):

		try:
			# create DATABASE
			connection = sqlite.connect("E:\Schule\Programmieren\WeightWatcher\WeightWatcher.db", isolation_level = None)

			# create TABLE
			cursor = connection.cursor()
			cursor.execute("""CREATE TABLE WeightWatcher(id integer primary key,date char(8),weight varchar(10),difference char(4))""")
		except:
			print "Error!"


weight = raw_input("Enter your today's weight")

weightwatcher = WeightWatcher(weight)
#weightwatcher.createDatabase()
weightwatcher.computeWeightDifference()
weightwatcher.writeIntoDatabase()




self.difference ist immer nun immer 0.0, weiß jemand wieso?

Verfasst: Sonntag 29. April 2007, 18:20
von BlackJack
Integerarithmetik:

Code: Alles auswählen

In [24]: 50 / 100
Out[24]: 0
Wenn beide Zahlen ganze Zahlen sind, dann ist auch das Ergbnis der Division eine ganze Zahl.

Das Datum kann man übrigens einfacher als Zeichenkette erhalten:

Code: Alles auswählen

In [25]: time.strftime('%d.%m.%Y')
Out[25]: '29.04.2007'
Edit: Sag mal Dir ist schon klar, dass man in SQL-Datenbanken nicht nur Zeichenketten stecken kann, insbesondere wenn die Daten eigentlich Zahlen und Daten sind!? Was auch den Vorteil hätte, das die Daten dann auch als Zahlen wieder aus der Datenbank herauskommen.

Verfasst: Sonntag 29. April 2007, 18:54
von cyp++
gibt es in SQL denn float?

Verfasst: Sonntag 29. April 2007, 19:42
von gerold
cyp++ hat geschrieben:gibt es in SQL denn float?
Hi cyp++!

http://docs.python.org/lib/node346.html

Hier hast du mal einen Prototypen, der auch mit Timestamps klar kommt.

Code: Alles auswählen

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

try:
    import sqlite3
except ImportError:
    from pysqlite2 import dbapi2 as sqlite3
import datetime

# Connection so erstellen, dass DATE- und TIMESTAMP-Felder erkannt werden.
conn = sqlite3.connect(
    ":memory:",
    detect_types = sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES
)

# weights-Tabelle erstellen
sql = """
CREATE TABLE weights (
    id INTEGER PRIMARY KEY,
    timestamp TIMESTAMP,
    weight REAL
)
"""
conn.execute(sql)
conn.commit()

# Index mit dem Feld timestamp erstellen
sql = """
CREATE INDEX ix_weights_timestamp 
ON weights (timestamp)
"""
conn.execute(sql)
conn.commit()

# Einen Datensatz in die Tabelle weights schreiben
sql = """
INSERT INTO weights (timestamp, weight) VALUES (?, ?)
"""
conn.execute(
    sql, (datetime.datetime.now(), 100)
)
conn.commit()

# Zwei Datensätze in die Tabelle weights schreiben
conn.executemany(
    sql, (
        (datetime.datetime.now(), 90),
        (datetime.datetime.now(), 80),
    )
)

# Alle Datensätze der Tabelle weights auslesen
sql = """
SELECT * FROM weights
"""
cur = conn.cursor()
cur.execute(sql)

for row in cur:
    print row # --> (1, datetime.datetime(2007, 4, 29, 20, 33, 47, 781000), 100.0)

Code: Alles auswählen

(1, datetime.datetime(2007, 4, 29, 22, 57, 24, 781000), 100.0)
(2, datetime.datetime(2007, 4, 29, 22, 57, 24, 781000), 90.0)
(3, datetime.datetime(2007, 4, 29, 22, 57, 24, 781000), 80.0)
mfg
Gerold
:-)

Verfasst: Sonntag 29. April 2007, 21:56
von gerold
...Fortsetzung:

Code: Alles auswählen

# Letzten Datensatz der Tabelle weights auslesen
sql = """
SELECT id, timestamp, weight FROM weights ORDER BY id DESC LIMIT 1
"""
cur = conn.cursor()
cur.execute(sql)

id, timestamp, weight = cur.fetchone()

print "id:", id
print "timestamp:", timestamp
print "irgendeine Rechnung mit weight:", weight / 100

Code: Alles auswählen

id: 3
timestamp: 2007-04-29 22:56:19.765000
irgendeine Rechnung mit weight: 0.8
mfg
Gerold
:-)