def __init__(self, length):
self.length = length
-
-class FLOAT:
+class Numeric:
def __init__(self, precision, length):
self.precision = precision
self.length = length
-
+class FLOAT(Numeric):pass
class TEXT: pass
-class DECIMAL: pass
+class DECIMAL(Numeric):pass
class TIMESTAMP: pass
class DATETIME: pass
class CLOB: pass
"""proxies method calls to an underlying implementation object for methods not found locally"""
return getattr(self._impl, key)
+
+class TableSingleton(type):
+ def __call__(self, name, engine, *args, **kwargs):
+ try:
+ return engine.tables[name]
+ except:
+ table = type.__call__(self, name, engine, *args, **kwargs)
+ engine.tables[name] = table
+ # load column definitions from the database if 'autoload' is defined
+ if kwargs.get('autoload', False):
+ engine.reflecttable(table)
+ return table
+
+
+
class Table(SchemaItem):
"""represents a relational database table."""
-
+ __metaclass__ = TableSingleton
+
def __init__(self, name, engine, *args, **kwargs):
+ print "new table ! " + name + " " +repr(id(self))
self.name = name
self.columns = OrderedProperties()
self.c = self.columns
self._impl = self.engine.tableimpl(self)
self._init_items(*args)
- # load column definitions from the database if 'autoload' is defined
- if kwargs.get('autoload', False):
- self.engine.reflecttable(self)
-
def append_item(self, item):
self._init_items(item)
class Column(SchemaItem):
"""represents a column in a database table."""
- def __init__(self, name, type, key = None, primary_key = False, foreign_key = None, sequence = None):
+ def __init__(self, name, type, key = None, primary_key = False, foreign_key = None, sequence = None, nullable = True):
self.name = name
self.type = type
self.sequence = sequence
self.foreign_key = foreign_key
self.key = key or name
self.primary_key = primary_key
+ if primary_key:
+ nullable = False
+ self.nullable = nullable
self._orig = None
original = property(lambda s: s._orig or s)
self._init_items(self.foreign_key)
table.foreign_keys[self.foreign_key.column.key] = self.foreign_key
+ def set_foreign_key(self, fk):
+ self.foreign_key = fk
+ self._init_items(self.foreign_key)
+ self.table.foreign_keys[self.foreign_key.column.key] = self.foreign_key
+
def _make_proxy(self, selectable, name = None):
"""creates a copy of this Column for use in a new selectable unit"""
# using copy.copy(c) seems to add a full second to the select.py unittest package
"""a factory object used to create implementations for schema objects"""
def tableimpl(self, table):
raise NotImplementedError()
-
def columnimpl(self, column):
raise NotImplementedError()
-
+ def reflecttable(self, table):
+ raise NotImplementedError()
+
class SchemaVisitor(object):
"""base class for an object that traverses across Schema objects"""