Update of /cvsroot/sqlobject/SQLObject/SQLObject
In directory sc8-pr-cvs1:/tmp/cvs-serv12426/SQLObject
Modified Files:
Col.py DBConnection.py SQLObject.py
Log Message:
Support for reading a class from a table definition (for MySQL)
Index: Col.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/Col.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -C2 -d -r1.2 -r1.3
*** Col.py 29 Mar 2003 20:13:14 -0000 1.2
--- Col.py 31 Mar 2003 05:51:28 -0000 1.3
***************
*** 5,11 ****
import SQLBuilder
from util import splitWords
import Constraints
! class NoDefault: pass
True, False = 1==1, 0==1
--- 5,12 ----
import SQLBuilder
from util import splitWords
+ import re
import Constraints
! NoDefault = SQLBuilder.NoDefault
True, False = 1==1, 0==1
***************
*** 90,94 ****
def __repr__(self):
! r = '<Col %s.%s' % (self.className, self.name)
if self.default is not NoDefault:
r += ' default=%s' % repr(self.default)
--- 91,95 ----
def __repr__(self):
! r = '<%s %s' % (self.__class__.__name__, self.name)
if self.default is not NoDefault:
r += ' default=%s' % repr(self.default)
***************
*** 97,100 ****
--- 98,103 ----
if self.alternateID:
r += ' alternate ID'
+ if self.notNull:
+ r += ' not null'
return r + '>'
***************
*** 227,230 ****
--- 230,254 ----
del kw[name]
return value
+
+ def guessClass(t):
+ if t.startswith('int'):
+ return IntCol, {}
+ elif t.startswith('varchar'):
+ return StringCol, {'length': int(t[8:-1])}
+ elif t.startswith('char'):
+ return StringCol, {'length': int(t[5:-1]),
+ 'varchar': False}
+ elif t.startswith('datetime'):
+ return DateTimeCol, {}
+ else:
+ return Col, {}
+
+ _generatePythonNameRE = re.compile('_.')
+ def generatePythonName(name):
+ if name.endswith('_id'):
+ return generatePythonName(name[:-3] + "ID")
+ def subber(match):
+ return match.group(0)[1].upper()
+ return _generatePythonNameRE.sub(subber, name)
all = []
Index: DBConnection.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/DBConnection.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** DBConnection.py 31 Mar 2003 02:00:58 -0000 1.8
--- DBConnection.py 31 Mar 2003 05:51:28 -0000 1.9
***************
*** 4,7 ****
--- 4,8 ----
import SQLBuilder
from Cache import CacheSet
+ import Col
try:
***************
*** 305,312 ****
column.mysqlCreateSQL()))
! def dropColumn(self, tableName, column):
self.query('ALTER TABLE %s DROP COLUMN %s' %
(tableName,
column.dbName))
class PostgresConnection(DBAPI):
--- 306,329 ----
column.mysqlCreateSQL()))
! def delColumn(self, tableName, column):
self.query('ALTER TABLE %s DROP COLUMN %s' %
(tableName,
column.dbName))
+
+ def columnsFromSchema(self, tableName):
+ colData = self.queryAll("SHOW COLUMNS FROM %s"
+ % tableName)
+ results = []
+ for field, t, nullAllowed, key, default, extra in colData:
+ if field == 'id':
+ continue
+ colClass, kw = Col.guessClass(t)
+ kw['name'] = Col.generatePythonName(field)
+ kw['notNull'] = not nullAllowed
+ kw['default'] = default
+ # @@ skip key...
+ # @@ skip extra...
+ results.append(colClass(**kw))
+ return results
class PostgresConnection(DBAPI):
Index: SQLObject.py
===================================================================
RCS file: /cvsroot/sqlobject/SQLObject/SQLObject/SQLObject.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** SQLObject.py 31 Mar 2003 02:00:58 -0000 1.11
--- SQLObject.py 31 Mar 2003 05:51:28 -0000 1.12
***************
*** 173,180 ****
newClass = type.__new__(cls, className, bases, dict)
! for column in newClass._columns:
newClass.addColumn(column)
! for join in newClass._joins:
newClass.addJoin(join)
--- 173,182 ----
newClass = type.__new__(cls, className, bases, dict)
! for column in newClass._columns[:]:
newClass.addColumn(column)
+ if dict.get('_fromDatabase'):
+ newClass.addColumnsFromDatabase()
! for join in newClass._joins[:]:
newClass.addJoin(join)
***************
*** 233,242 ****
def unmakeProperties(obj):
if isinstance(obj, dict):
! def delFunc(var):
del obj[var]
d = obj
else:
! def delFunc(var):
! delattr(obj, var)
d = obj.__dict__
--- 235,243 ----
def unmakeProperties(obj):
if isinstance(obj, dict):
! def delFunc(obj, var):
del obj[var]
d = obj
else:
! delFunc = delattr
d = obj.__dict__
***************
*** 244,249 ****
if isinstance(value, property):
for prop in [value.fget, value.fset, value.fdel]:
! if prop and not dict.has_key(prop.__name__):
! delFunc(var)
def generateTableName(s):
--- 245,251 ----
if isinstance(value, property):
for prop in [value.fget, value.fset, value.fdel]:
! if prop and not d.has_key(prop.__name__):
! delFunc(obj, var)
! break
def generateTableName(s):
***************
*** 317,320 ****
--- 319,325 ----
cls._SO_columnDict[name] = column
+ if column not in cls._columns:
+ cls._columns.append(column)
+
###################################################
# Create the getter function(s). We'll start by
***************
*** 415,419 ****
--- 420,432 ----
addColumn = classmethod(addColumn)
+ def addColumnsFromDatabase(cls):
+ for column in cls._connection.columnsFromSchema(cls._table):
+ if not cls._SO_columnDict.has_key(column.name):
+ cls.addColumn(column)
+
+ addColumnsFromDatabase = classmethod(addColumnsFromDatabase)
+
def delColumn(cls, column, changeSchema=False):
+ cls._columns.remove(column)
if isinstance(column, str):
column = self._SO_columnDict[column]
***************
*** 428,435 ****
if column.foreignKey:
delattr(cls, rawGetterName(name)[:-2])
! if cls._SO_plainForeignGetter.has_key(name[:-2]):
delattr(cls, getterName(name)[:-2])
delattr(cls, rawSetterName(name)[:-2])
! if cls._SO_plainForeignSetter.has_key(name[:-2]):
delattr(cls, setterName(name)[:-2])
if column.alternateMethodName:
--- 441,448 ----
if column.foreignKey:
delattr(cls, rawGetterName(name)[:-2])
! if cls._SO_plainForeignGetters.has_key(name[:-2]):
delattr(cls, getterName(name)[:-2])
delattr(cls, rawSetterName(name)[:-2])
! if cls._SO_plainForeignSetters.has_key(name[:-2]):
delattr(cls, setterName(name)[:-2])
if column.alternateMethodName:
***************
*** 437,441 ****
if changeSchema:
! cls._connection.delColumn(self._table, column)
if cls._SO_finishedClassCreation:
--- 450,454 ----
if changeSchema:
! cls._connection.delColumn(cls._table, column)
if cls._SO_finishedClassCreation:
***************
*** 449,452 ****
--- 462,468 ----
# join class.
meth = join.joinMethodName
+
+ if join not in cls._joins:
+ cls._joins.append(join)
# The method name for adding a joined object:
***************
*** 502,505 ****
--- 518,522 ----
def delJoin(cls, join):
meth = join.joinMethodName
+ cls._joins.remove(join)
appendMeth = meth[0].upper() + meth[1:]
for i in range(len(cls._SO_joinList)):
|