Ejemplo n.º 1
0
Archivo: db.py Proyecto: gh2o/ScanInOut
def build_table (tbname, focls, column_args={}, column_kwargs={}, **kwargs):

	columns = []

	column_args = column_args.copy ()
	column_kwargs = column_kwargs.copy ()

	for name in focls._fields_keys:

		field = focls._fields[name]
		ptype = field.actual_type

		cargs = column_args.pop (name, [])
		ckwargs = column_kwargs.pop (name, {})

		ckwargs.setdefault ("default", field.clone_default ())
		ckwargs.setdefault ("nullable", not field.required)

		ctype = None

		if ptype is int:
			ctype = Integer
			ckwargs["primary_key"] = (name == 'id')
		elif ptype is basestring:
			ctype = String
		elif ptype is list or ptype is dict:
			ctype = JSON
		elif ptype is datetime.datetime:
			ctype = DateTime
		else:
			raise TypeError ("unknown actual_type %r" % ptype)

		columns.append (Column (name, ctype, *cargs, **ckwargs))
	
	if column_args:
		raise ValueError ("unknown column_args keys: %r" % column_args.keys ())
	if column_kwargs:
		raise ValueError ("unknown column_kwargs keys: %r" % column_args.keys ())

	table = Table (tbname, metadata, *columns)
	table.mapper = mapper (focls, table, **kwargs)
	return table