From 1f9e422b8d31303a97da950edab3678f4e42f024 Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Mon, 7 Jun 2010 17:53:34 +0000 Subject: [PATCH] [soc2010/query-refactor] Refactor, and implement a few more methods to get models saving under the mongodb backend. git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2010/query-refactor@13332 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/mongodb/base.py | 26 ++++++++++++++++++++++++++ django/contrib/mongodb/compiler.py | 15 +++++++++++++++ django/db/models/query.py | 2 +- django/db/models/sql/compiler.py | 3 +++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 django/contrib/mongodb/compiler.py diff --git a/django/contrib/mongodb/base.py b/django/contrib/mongodb/base.py index 17c5f28067..825a39787d 100644 --- a/django/contrib/mongodb/base.py +++ b/django/contrib/mongodb/base.py @@ -3,6 +3,7 @@ from pymongo import Connection from django.db.backends import BaseDatabaseWrapper from django.db.backends.signals import connection_created from django.contrib.mongodb.creation import DatabaseCreation +from django.utils.importlib import import_module class DatabaseFeatures(object): @@ -10,12 +11,29 @@ class DatabaseFeatures(object): class DatabaseOperations(object): + compiler_module = "django.contrib.mongodb.compiler" + + def __init__(self, *args, **kwargs): + self._cache = {} + def max_name_length(self): return 254 def value_to_db_datetime(self, value): return value + # TODO: this is copy pasta, fix the abstractions in Ops + def compiler(self, compiler_name): + """ + Returns the SQLCompiler class corresponding to the given name, + in the namespace corresponding to the `compiler_module` attribute + on this backend. + """ + if compiler_name not in self._cache: + self._cache[compiler_name] = getattr( + import_module(self.compiler_module), compiler_name + ) + return self._cache[compiler_name] class DatabaseWrapper(BaseDatabaseWrapper): def __init__(self, *args, **kwargs): @@ -33,6 +51,14 @@ class DatabaseWrapper(BaseDatabaseWrapper): connection_created.send(sender=self.__class__) return self._connection + @property + def db(self): + return self.connection[self.settings_dict["NAME"]] + def _rollback(self): # TODO: ??? pass + + def _commit(self): + # TODO: ??? + pass diff --git a/django/contrib/mongodb/compiler.py b/django/contrib/mongodb/compiler.py new file mode 100644 index 0000000000..b4c4cbd347 --- /dev/null +++ b/django/contrib/mongodb/compiler.py @@ -0,0 +1,15 @@ +# TODO: ... +class SQLCompiler(object): + def __init__(self, query, connection, using): + self.query = query + self.connection = connection + self.using = using + + +class SQLInsertCompiler(SQLCompiler): + def insert(self, return_id=False): + values = dict([ + (c, v) + for c, v in zip(self.query.columns, self.query.params) + ]) + return self.connection.db[self.query.model._meta.db_table].insert(values) diff --git a/django/db/models/query.py b/django/db/models/query.py index d9fbd9b8cb..a2a82f85ee 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -1476,4 +1476,4 @@ def insert_query(model, values, return_id=False, raw_values=False, using=None): """ query = sql.InsertQuery(model) query.insert_values(values, raw_values) - return query.get_compiler(using=using).execute_sql(return_id) + return query.get_compiler(using=using).insert(return_id) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index eaf2cd2569..2877171fd2 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -787,6 +787,9 @@ class SQLInsertCompiler(SQLCompiler): return self.connection.ops.fetch_returned_insert_id(cursor) return self.connection.ops.last_insert_id(cursor, self.query.model._meta.db_table, self.query.model._meta.pk.column) + + def insert(self, *args, **kwargs): + return self.execute_sql(*args, **kwargs) class SQLDeleteCompiler(SQLCompiler):