def add_to_query(self, query, aliases): # evaluate if it is a query expression if hasattr(self.left_expression, 'evaluate'): self.left_expression = SQLEvaluator(self.left_expression, query) if hasattr(self.right_expression, 'evaluate'): self.right_expression = SQLEvaluator(self.right_expression, query) query.where.add(FExpression(self.left_expression, self.lookup_type, self.right_expression), self.connector)
def add_update_fields(self, values_seq): """ Turn a sequence of (field, model, value) triples into an update query. Used by add_update_values() as well as the "fast" update path when saving models. """ from django.db.models.base import Model for field, model, val in values_seq: if hasattr(val, 'prepare_database_save'): val = val.prepare_database_save(field) else: val = field.get_db_prep_save(val) # Getting the placeholder for the field. if hasattr(field, 'get_placeholder'): placeholder = field.get_placeholder(val) else: placeholder = '%s' if hasattr(val, 'evaluate'): val = SQLEvaluator(val, self, allow_joins=False) if model: self.add_related_update(model, field.column, val, placeholder) else: self.values.append((field.column, val, placeholder))
def as_sql(self): """ Creates the SQL for this query. Returns the SQL string and list of parameters. """ from django.db.models.base import Model self.pre_sql_setup() if not self.query.values: return '', () table = self.query.tables[0] qn = self.quote_name_unless_alias result = ['UPDATE %s' % qn(table)] result.append('SET') values, update_params = [], [] for field, model, val in self.query.values: if hasattr(val, 'prepare_database_save'): val = val.prepare_database_save(field) else: val = field.get_db_prep_save(val, connection=self.connection) # Getting the placeholder for the field. if hasattr(field, 'get_placeholder'): placeholder = field.get_placeholder(val, self.connection) else: placeholder = '%s' if hasattr(val, 'evaluate'): val = SQLEvaluator(val, self.query, allow_joins=False) name = field.column if hasattr(val, 'as_sql'): sql, params = val.as_sql(qn, self.connection) values.append('%s = %s' % (qn(name), sql)) update_params.extend(params) elif val is not None: values.append('%s = %s' % (qn(name), placeholder)) update_params.append(val) else: values.append('%s = NULL' % qn(name)) if not values: return '', () result.append(', '.join(values)) where, params = self.query.where.as_sql(qn=qn, connection=self.connection) if where: result.append('WHERE %s' % where) return ' '.join(result), tuple(update_params + params)
def as_sql(self): if getattr(settings, 'SPHINX_INDEX_RT', True): qn = self.connection.ops.quote_name opts = self.query.model._meta result = ['REPLACE INTO %s' % qn(opts.db_table)] # This is a bit ugly, we have to scrape information from the where clause # and put it into the field/values list. Sphinx will not accept an UPDATE # statement that includes full text data, only INSERT/REPLACE INTO. lvalue, lookup_type, value_annot, params_or_value = self.query.where.children[ 0].children[0] (table_name, column_name, column_type), val = lvalue.process(lookup_type, params_or_value, self.connection) fields, values, params = [column_name], ['%s'], [val[0]] # Now build the rest of the fields into our query. for field, model, val in self.query.values: if hasattr(val, 'prepare_database_save'): val = val.prepare_database_save(field) else: val = field.get_db_prep_save(val, connection=self.connection) # Getting the placeholder for the field. if hasattr(field, 'get_placeholder'): placeholder = field.get_placeholder(val, self.connection) else: placeholder = '%s' if hasattr(val, 'evaluate'): val = SQLEvaluator(val, self.query, allow_joins=False) name = field.column if hasattr(val, 'as_sql'): sql, params = val.as_sql(qn, self.connection) values.append(sql) params.extend(params) elif val is not None: values.append(placeholder) params.append(val) else: values.append('NULL') fields.append(name) result.append('(%s)' % ', '.join(fields)) result.append('VALUES (%s)' % ', '.join(values)) return ' '.join(result), params else: return super(SQLUpdateCompiler, self).as_sql()
def as_sql(self): """ Creates the SQL for this query. Returns the SQL string and list of parameters. """ self.pre_sql_setup() if not self.query.values: return "", () table = self.query.tables[0] qn = self.quote_name_unless_alias result = ["UPDATE %s" % qn(table)] result.append("SET") values, update_params = [], [] for field, model, val in self.query.values: if hasattr(val, "prepare_database_save"): val = val.prepare_database_save(field) else: val = field.get_db_prep_save(val, connection=self.connection) # Getting the placeholder for the field. if hasattr(field, "get_placeholder"): placeholder = field.get_placeholder(val, self.connection) else: placeholder = "%s" if hasattr(val, "evaluate"): val = SQLEvaluator(val, self.query, allow_joins=False) name = field.column if hasattr(val, "as_sql"): sql, params = val.as_sql(qn, self.connection) values.append("%s = %s" % (qn(name), sql)) update_params.extend(params) elif val is not None: values.append("%s = %s" % (qn(name), placeholder)) update_params.append(val) else: values.append("%s = NULL" % qn(name)) if not values: return "", () result.append(", ".join(values)) where, params = self.query.where.as_sql(qn=qn, connection=self.connection) if where: result.append("WHERE %s" % where) return " ".join(result), tuple(update_params + params)
def as_sql(self): qn = self.connection.ops.quote_name opts = self.query.model._meta result = ['REPLACE INTO %s' % qn(opts.db_table)] # This is a bit ugly, we have to scrape information from the where clause # and put it into the field/values list. Sphinx will not accept an UPDATE # statement that includes full text data, only INSERT/REPLACE INTO. node = self.query.where.children[0] if django.VERSION < DJANGO16: lvalue, lookup_type, value_annot, params_or_value = node.children[0] else: lvalue, lookup_type, value_annot, params_or_value = node (table_name, column_name, column_type), val = lvalue.process(lookup_type, params_or_value, self.connection) fields, values, params = [column_name], ['%s'], [val[0]] # Now build the rest of the fields into our query. for field, model, val in self.query.values: if hasattr(val, 'prepare_database_save'): val = val.prepare_database_save(field) else: val = field.get_db_prep_save(val, connection=self.connection) # Getting the placeholder for the field. if hasattr(field, 'get_placeholder'): placeholder = field.get_placeholder(val, self.connection) else: placeholder = '%s' if hasattr(val, 'evaluate'): val = SQLEvaluator(val, self.query, allow_joins=False) name = field.column if hasattr(val, 'as_sql'): sql, params = val.as_sql(qn, self.connection) values.append(sql) params.extend(params) elif val is not None: values.append(placeholder) params.append(val) else: values.append('NULL') fields.append(name) result.append('(%s)' % ', '.join(fields)) result.append('VALUES (%s)' % ', '.join(values)) return ' '.join(result), params
def as_sql(self): """ Creates the SQL for this query. Returns the SQL string and list of parameters. """ self.pre_sql_setup() if not self.query.values: return '', () table = self.query.tables[0] qn = self result = ['UPDATE %s' % qn(table)] result.append('SET') values, update_params = [], [] for field, model, val in self.query.values: if hasattr(val, 'prepare_database_save'): if field.rel or isinstance(val, ExpressionNode): val = val.prepare_database_save(field) else: raise TypeError("Database is trying to update a relational field " "of type %s with a value of type %s. Make sure " "you are setting the correct relations" % (field.__class__.__name__, val.__class__.__name__)) else: val = field.get_db_prep_save(val, connection=self.connection) # Getting the placeholder for the field. if hasattr(field, 'get_placeholder'): placeholder = field.get_placeholder(val, self.connection) else: placeholder = '%s' if hasattr(val, 'evaluate'): val = SQLEvaluator(val, self.query, allow_joins=False) name = field.column if hasattr(val, 'as_sql'): sql, params = self.compile(val) values.append('%s = %s' % (qn(name), sql)) update_params.extend(params) elif val is not None: values.append('%s = %s' % (qn(name), placeholder)) update_params.append(val) else: values.append('%s = NULL' % qn(name)) if not values: return '', () result.append(', '.join(values)) where, params = self.compile(self.query.where) if where: result.append('WHERE %s' % where) return ' '.join(result), tuple(update_params + params)
def add_update_fields(self, values_seq): """ Turn a sequence of (field, model, value) triples into an update query. Used by add_update_values() as well as the "fast" update path when saving models. """ from django.db.models.base import Model for field, model, val in values_seq: # FIXME: Some sort of db_prep_* is probably more appropriate here. if field.rel and isinstance(val, Model): val = val.pk # Getting the placeholder for the field. if hasattr(field, 'get_placeholder'): placeholder = field.get_placeholder(val) else: placeholder = '%s' if hasattr(val, 'evaluate'): val = SQLEvaluator(val, self, allow_joins=False) if model: self.add_related_update(model, field.column, val, placeholder) else: self.values.append((field.column, val, placeholder))