Objektfragen: Class und Scope von MySQL-Datenbank
Verfasst: Montag 25. Januar 2010, 15:29
Gegeben:
- Eine Datenbank in MySQL, "kajtajm"
- Python-Scripts ohne "class", die mit MySQLdb die Datenbank lesen und schreiben
- Umgebung: Mac command line interface, .py -Dateien
Bedarf:
- Funktionierende, am liebsten auch schöne Class-Schnittstelle zur gleichen Datenbank
- das Lernen der richtigen Objektprogrammierung mit Python (vielleicht wäre Django gut, aber ich möchte erstmal die Grundsteine selbst verstehen)
Diagnose:
- die unten definierte Datei ktclasses.py startet in Mac die X-Umgebung und gibt nach zweimal Verlassen von X diese Fehlermeldung
1. Wie vermeide ich es, dass X aus einem mir unerklärlichen Grund gestartet wird? (Die Scripts ohne "class" starten kein X sondern geben ihr Output am Command Line)
2. Wo definiere ich Scope-mäßig (Gültigkeitsbereich) die Verbindung zur Datenbank so, dass ich ein "Thread Pool" (oder ähnliches) bekomme? Ich möchte ja nur ein Cursor neu starten und schließen, ungern aber eine ganze Verbindung zur Datenbank.
Inhalt ktclasses.py:
- Eine Datenbank in MySQL, "kajtajm"
- Python-Scripts ohne "class", die mit MySQLdb die Datenbank lesen und schreiben
- Umgebung: Mac command line interface, .py -Dateien
Bedarf:
- Funktionierende, am liebsten auch schöne Class-Schnittstelle zur gleichen Datenbank
- das Lernen der richtigen Objektprogrammierung mit Python (vielleicht wäre Django gut, aber ich möchte erstmal die Grundsteine selbst verstehen)
Diagnose:
- die unten definierte Datei ktclasses.py startet in Mac die X-Umgebung und gibt nach zweimal Verlassen von X diese Fehlermeldung
Wenn ich dahingegen genau die gleiche Befehle an der Python-Commandzeile angebe, funktioniert es wie gewünscht:kaj@Birger[kajtajm]$ ktclasses.py
X connection to /tmp/launch-8TKCAP/:0 broken (explicit kill or server shutdown).
X connection to /tmp/launch-8TKCAP/:0 broken (explicit kill or server shutdown).
./ktclasses.py: line 6: class: command not found
./ktclasses.py: line 7: syntax error near unexpected token `('
./ktclasses.py: line 7: ` db = MySQLdb.connect(db="kajtajm",read_default_file="~/.my.cnf")'
Problemekaj@Birger[kajtajm]$ python
Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> # Classes for kajtajm
...
>>> import sys
>>> import MySQLdb
>>>
>>> class KtDbRow:
... db = MySQLdb.connect(db="kajtajm",read_default_file="~/.my.cnf")
... # myKtRow = KtRow("2010-01-01",1000,1015,"Python","Some long text")
...blabla die ganzen Zeilen...
>>> myKtDbRow = KtDbRow("2010-01-25",1100,1015,"Python","Some long text")
>>> print myKtDbRow.val()
2010-01-25 1100-1015 Python -0.75 (Some) Some long text
>>> print myKtDbRow.shortval()
1100-1015 Python -0.75 (Some) Some long text
>>> print myKtDbRow.wherestring()
WHERE kajdate="2010-01-25" AND timefrom=1100
>>> print myKtDbRow.insertstring()
INSERT INTO kajtimerow (kajdate, timefrom, timeto, project, kajtext, hours, keyword) VALUES ("2010-01-25",1100,1015,"Python","Some long text",-0.75,"Some")
>>> print myKtDbRow.updatestring()
UPDATE kajtimerow SET timeto=1015, project="Python", kajtext="Some long text", hours=-0.75, keyword="Some" WHERE kajdate="2010-01-25" AND timefrom=1100
>>> print myKtDbRow.deletestring()
DELETE from kajtimerow WHERE kajdate="2010-01-25" AND timefrom=1100
>>> print myKtDbRow.exists()
(datetime.date(2010, 1, 25), 1100, 1115, 'kajtajm', 'ktrpt F\xc3\xb6rb\xc3\xa4ttringar (urval, rubriker', Decimal("0.25"), 'ktrpt')
False
>>>
1. Wie vermeide ich es, dass X aus einem mir unerklärlichen Grund gestartet wird? (Die Scripts ohne "class" starten kein X sondern geben ihr Output am Command Line)
2. Wo definiere ich Scope-mäßig (Gültigkeitsbereich) die Verbindung zur Datenbank so, dass ich ein "Thread Pool" (oder ähnliches) bekomme? Ich möchte ja nur ein Cursor neu starten und schließen, ungern aber eine ganze Verbindung zur Datenbank.
Inhalt ktclasses.py:
Code: Alles auswählen
# Classes for kajtajm
import sys
import MySQLdb
class KtDbRow:
db = MySQLdb.connect(db="kajtajm",read_default_file="~/.my.cnf")
# Wann wird je die obige Zeile ausgeführt?
# myKtRow = KtRow("2010-01-01",1000,1015,"Python","Some long text")
def __init__(self, kajdate, timefrom, timeto, project, kajtext):
self.kajdate = str(kajdate) # in MySQL format i.e. 2001-01-01
self.timefrom = int(timefrom)
self.timeto = int(timeto)
self.project = project # 10 chars
self.kajtext = kajtext # 50 chars
self.hours = (60*(timeto/100-timefrom/100) + timeto%100 - timefrom%100)/60.0
self.keyword = kajtext.split()[0][0:10] # First 10 chars of first word in kajtext
def info(self):
return (self)
#
# Contents in user readable string form
def shortval(self):
return str(self.timefrom) + "-" + str(self.timeto) + " " + self.project \
+ " " + str(self.hours) + " (" + self.keyword + ") " + self.kajtext
def val(self):
return self.kajdate + " " + self.shortval()
#
# SQL string representations
def wherestring(self):
return 'WHERE kajdate="' + self.kajdate + '" AND timefrom=' + str(self.timefrom)
def insertstring(self):
return "INSERT INTO kajtimerow (kajdate, timefrom, timeto, project, " + \
'kajtext, hours, keyword) VALUES ("' + self.kajdate + '",' + str(self.timefrom) + \
',' + str(self.timeto) + ',"' + self.project + '","' + self.kajtext + '",' + \
str(self.hours) + ',"' + self.keyword + '")'
def updatestring(self):
return "UPDATE kajtimerow SET timeto=" + str(self.timeto)+ ', project="' \
+ self.project + '", kajtext="' + self.kajtext + '", hours=' + \
str(self.hours) + ', keyword="' + self.keyword + '" ' + self.wherestring()
def deletestring(self):
return "DELETE from kajtimerow " + self.wherestring()
#
# Database communication
def opendb(self):
# Check the MySQLdb module is available, if not error and exit
try:
import MySQLdb
except ImportError:
print "\nktopendb.py error: MySQLdb module required for interactive usage\n"
sys.exit(0)
# Open the connection to the database
try:
return MySQLdb.connect(db="kajtajm",read_default_file="~/.my.cnf")
# If there is an exception, print the error and exit
except MySQLdb.Error, e:
print "ktopendb.py: Couldn't open kajtajm database"
print "Error %d: %s" % (e.args[0], e.args[1])
sys.exit (1)
def exists(self):
db = self.opendb()
c = db.cursor()
c.execute("SELECT * FROM kajtajmrow " + self.wherestring())
row = c.fetchone()
print row
return row[0]==1
def insert(self):
return true
def update(self):
return true
def delete(self):
return true
myKtDbRow = KtDbRow("2010-01-25",1100,1015,"Python","Some long text")
print myKtDbRow.val()
print myKtDbRow.shortval()
print myKtDbRow.wherestring()
print myKtDbRow.insertstring()
print myKtDbRow.updatestring()
print myKtDbRow.deletestring()
print myKtDbRow.exists()