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