diff --git a/.gitignore b/.gitignore index d396746..be852cd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *.egg dist/* .tox/* +.vscode/* build/* .DS_Store .watchr diff --git a/dataset/table.py b/dataset/table.py index 6c0cfd4..a7d1125 100644 --- a/dataset/table.py +++ b/dataset/table.py @@ -384,7 +384,7 @@ class Table(object): return True for column in columns: if not self.has_column(column): - raise DatasetException("Column does not exist: %s" % column) + return False indexes = self.db.inspect.get_indexes(self.name, schema=self.db.schema) for index in indexes: if columns == set(index.get('column_names', [])): @@ -405,6 +405,10 @@ class Table(object): if not self.exists: raise DatasetException("Table has not been created yet.") + for column in columns: + if not self.has_column(column): + return + if not self.has_index(columns): self._threading_warn() name = name or index_name(self.name, columns) diff --git a/dataset/util.py b/dataset/util.py index 0a7f11f..4fb933f 100644 --- a/dataset/util.py +++ b/dataset/util.py @@ -1,12 +1,7 @@ -try: - from urlparse import urlparse -except ImportError: - from urllib.parse import urlparse - -from collections import OrderedDict, Sequence +import six from hashlib import sha1 - -from six import string_types +from collections import OrderedDict, Sequence +from six.moves.urllib.parse import urlparse QUERY_STEP = 1000 @@ -60,9 +55,16 @@ class ResultIter(object): def normalize_column_name(name): """Check if a string is a reasonable thing to use as a column name.""" - if not isinstance(name, string_types): + if not isinstance(name, six.string_types): raise ValueError('%r is not a valid column name.' % name) - name = name.strip() + + # limit to 63 characters + name = name.strip()[:63] + # column names can be 63 *bytes* max in postgresql + if isinstance(name, six.text_type): + while len(name.encode('utf-8')) >= 64: + name = name[:len(name) - 1] + if not len(name) or '.' in name or '-' in name: raise ValueError('%r is not a valid column name.' % name) return name @@ -70,9 +72,9 @@ def normalize_column_name(name): def normalize_table_name(name): """Check if the table name is obviously invalid.""" - if not isinstance(name, string_types): + if not isinstance(name, six.string_types): raise ValueError("Invalid table name: %r" % name) - name = name.strip() + name = name.strip()[:63] if not len(name): raise ValueError("Invalid table name: %r" % name) return name @@ -98,6 +100,6 @@ def ensure_tuple(obj): """Try and make the given argument into a tuple.""" if obj is None: return tuple() - if isinstance(obj, Sequence) and not isinstance(obj, string_types): + if isinstance(obj, Sequence) and not isinstance(obj, six.string_types): return tuple(obj) return obj, diff --git a/setup.py b/setup.py index c2a4686..c2acbf7 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup( name='dataset', - version='1.0.2', + version='1.0.3', description="Toolkit for Python-based database access.", long_description="", classifiers=[