Add has_index function

This commit is contained in:
Konsta Vesterinen
2014-05-30 09:54:06 +03:00
parent 35d577f271
commit 9fc5ca06d4
5 changed files with 102 additions and 4 deletions

View File

@@ -19,6 +19,7 @@ from .functions import (
get_referencing_foreign_keys, get_referencing_foreign_keys,
get_tables, get_tables,
group_foreign_keys, group_foreign_keys,
has_index,
identity, identity,
merge_references, merge_references,
mock_engine, mock_engine,
@@ -93,6 +94,7 @@ __all__ = (
get_referencing_foreign_keys, get_referencing_foreign_keys,
get_tables, get_tables,
group_foreign_keys, group_foreign_keys,
has_index,
identity, identity,
instrumented_list, instrumented_list,
merge_references, merge_references,

View File

@@ -3,10 +3,11 @@ from .mock import create_mock_engine, mock_engine
from .render import render_expression, render_statement from .render import render_expression, render_statement
from .sort_query import sort_query, QuerySorterException from .sort_query import sort_query, QuerySorterException
from .database import ( from .database import (
database_exists,
create_database, create_database,
database_exists,
drop_database, drop_database,
escape_like, escape_like,
has_index,
is_auto_assigned_date_column, is_auto_assigned_date_column,
) )
from .foreign_keys import ( from .foreign_keys import (

View File

@@ -1,6 +1,5 @@
from sqlalchemy.engine.url import make_url from sqlalchemy.engine.url import make_url
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy.schema import MetaData, Table, ForeignKeyConstraint
from sqlalchemy.exc import ProgrammingError, OperationalError from sqlalchemy.exc import ProgrammingError, OperationalError
import os import os
from copy import copy from copy import copy
@@ -31,6 +30,69 @@ def escape_like(string, escape_char='*'):
) )
def has_index(column):
"""
Return whether or not given column has an index. A column has an index if
it has a single column index or it is the first column in compound column
index.
:param column: SQLAlchemy Column object
.. versionadded: 0.26.2
::
from sqlalchemy_utils import has_index
class Article(Base):
__tablename__ = 'article_translation'
id = sa.Column(sa.Integer, primary_key=True)
title = sa.Column(sa.String(100))
is_published = sa.Column(sa.Boolean)
is_deleted = sa.Column(sa.Boolean)
is_archived = sa.Column(sa.Boolean)
__table_args__ = (
)
table = Article.__table__
has_index(table.c.is_published) # True
has_index(table.c.is_deleted) # True
has_index(table.c.is_archived) # False
Also supports primary key indexes
::
from sqlalchemy_utils import has_index
class ArticleTranslation(Base):
__tablename__ = 'article_translation'
id = sa.Column(sa.Integer, primary_key=True)
locale = sa.Column(sa.String(10), primary_key=True)
title = sa.Column(sa.String(100))
table = ArticleTranslation.__table__
has_index(table.c.locale) # False
has_index(table.c.id) # True
"""
return (
column is column.table.primary_key.columns.values()[0]
or
any(
index.columns.values()[0] is column
for index in column.table.indexes
)
)
def is_auto_assigned_date_column(column): def is_auto_assigned_date_column(column):
""" """
Returns whether or not given SQLAlchemy Column object's is auto assigned Returns whether or not given SQLAlchemy Column object's is auto assigned

View File

@@ -3,7 +3,6 @@ try:
except ImportError: except ImportError:
from ordereddict import OrderedDict from ordereddict import OrderedDict
from functools import partial from functools import partial
from itertools import groupby
from inspect import isclass from inspect import isclass
from operator import attrgetter from operator import attrgetter
import sqlalchemy as sa import sqlalchemy as sa
@@ -16,7 +15,6 @@ from sqlalchemy.orm.mapper import Mapper
from sqlalchemy.orm.query import _ColumnEntity from sqlalchemy.orm.query import _ColumnEntity
from sqlalchemy.orm.session import object_session from sqlalchemy.orm.session import object_session
from sqlalchemy.orm.util import AliasedInsp from sqlalchemy.orm.util import AliasedInsp
from ..query_chain import QueryChain
def get_mapper(mixed): def get_mapper(mixed):

View File

@@ -0,0 +1,35 @@
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy_utils import has_index
class TestHasIndex(object):
def setup_method(self, method):
Base = declarative_base()
class ArticleTranslation(Base):
__tablename__ = 'article_translation'
id = sa.Column(sa.Integer, primary_key=True)
locale = sa.Column(sa.String(10), primary_key=True)
title = sa.Column(sa.String(100))
is_published = sa.Column(sa.Boolean, index=True)
is_deleted = sa.Column(sa.Boolean)
is_archived = sa.Column(sa.Boolean)
__table_args__ = (
sa.Index('my_index', is_deleted, is_archived),
)
self.table = ArticleTranslation.__table__
def test_compound_primary_key(self):
assert has_index(self.table.c.id)
assert not has_index(self.table.c.locale)
def test_single_column_index(self):
assert has_index(self.table.c.is_published)
def test_compound_column_index(self):
assert has_index(self.table.c.is_deleted)
assert not has_index(self.table.c.is_archived)