do not create columns upon find(), fixes #143

This commit is contained in:
Friedrich Lindenberg 2016-02-12 18:10:50 +01:00
parent c45b98d862
commit cc742b7a00

View File

@ -3,7 +3,7 @@ from hashlib import sha1
from sqlalchemy.sql import and_, expression from sqlalchemy.sql import and_, expression
from sqlalchemy.schema import Column, Index from sqlalchemy.schema import Column, Index
from sqlalchemy import alias from sqlalchemy import alias, func
from dataset.persistence.util import guess_type, normalize_column_name from dataset.persistence.util import guess_type, normalize_column_name
from dataset.persistence.util import ResultIter from dataset.persistence.util import ResultIter
from dataset.util import DatasetException from dataset.util import DatasetException
@ -201,10 +201,13 @@ class Table(object):
rows = self.database.executable.execute(stmt) rows = self.database.executable.execute(stmt)
return rows.rowcount > 0 return rows.rowcount > 0
def _has_column(self, column):
return normalize_column_name(column) in self._normalized_columns
def _ensure_columns(self, row, types={}): def _ensure_columns(self, row, types={}):
# Keep order of inserted columns # Keep order of inserted columns
for column in row.keys(): for column in row.keys():
if normalize_column_name(column) in self._normalized_columns: if self._has_column(column):
continue continue
if column in types: if column in types:
_type = types[column] _type = types[column]
@ -214,11 +217,14 @@ class Table(object):
_type, self.table.name)) _type, self.table.name))
self.create_column(column, _type) self.create_column(column, _type)
def _args_to_clause(self, args): def _args_to_clause(self, args, ensure=True):
if ensure:
self._ensure_columns(args) self._ensure_columns(args)
clauses = [] clauses = []
for k, v in args.items(): for k, v in args.items():
if isinstance(v, (list, tuple)): if not self._has_column(k):
clauses.append(func.sum(1) == 2)
elif isinstance(v, (list, tuple)):
clauses.append(self.table.c[k].in_(v)) clauses.append(self.table.c[k].in_(v))
else: else:
clauses.append(self.table.c[k] == v) clauses.append(self.table.c[k] == v)
@ -352,7 +358,7 @@ class Table(object):
order_by = [o for o in order_by if (o.startswith('-') and o[1:] or o) in self.table.columns] order_by = [o for o in order_by if (o.startswith('-') and o[1:] or o) in self.table.columns]
order_by = [self._args_to_order_by(o) for o in order_by] order_by = [self._args_to_order_by(o) for o in order_by]
args = self._args_to_clause(_filter) args = self._args_to_clause(_filter, ensure=False)
# query total number of rows first # query total number of rows first
count_query = alias(self.table.select(whereclause=args, limit=_limit, offset=_offset), count_query = alias(self.table.select(whereclause=args, limit=_limit, offset=_offset),