You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.2 KiB
39 lines
1.2 KiB
from django.db.models.base import ModelBase
|
|
from django.db import connection
|
|
|
|
|
|
class ModelFieldsNames(object):
|
|
def __init__(self, model):
|
|
self.alias = None
|
|
self._meta = model._meta
|
|
|
|
def __getattr__(self, name):
|
|
alias = '__as__'
|
|
if name.startswith(alias):
|
|
self.alias = name[len(alias):]
|
|
return '%s as %s' % (self._meta.db_table, self.alias)
|
|
field = self._meta.get_field(name).get_attname_column()[1]
|
|
if self.alias:
|
|
return u"%s.%s" % (self.alias, field)
|
|
else:
|
|
return u"%s.%s" % (self._meta.db_table, field)
|
|
|
|
def __str__(self):
|
|
return '%s' % self._meta.db_table
|
|
|
|
|
|
def format_sql(sql, **kwargs):
|
|
for name, value in kwargs.items():
|
|
if issubclass(type(value), ModelBase):
|
|
kwargs[name] = ModelFieldsNames(value)
|
|
elif isinstance(value, (tuple, list)):
|
|
kwargs[name] = ','.join(map(lambda x: repr(x) if isinstance(x, str) else str(x), value))
|
|
elif not isinstance(value, str):
|
|
kwargs[name] = value
|
|
return sql.format(**kwargs)
|
|
|
|
|
|
def execute_sql(sql, args=()):
|
|
cursor = connection.cursor()
|
|
cursor.execute(sql, args)
|
|
return cursor.fetchall()
|
|
|