Skip to content

Commit

Permalink
Add indexes the same way as in SQLAlchemy and add test with alembic
Browse files Browse the repository at this point in the history
  • Loading branch information
adrien-berchet committed May 13, 2022
1 parent df88590 commit 58de466
Show file tree
Hide file tree
Showing 6 changed files with 377 additions and 13 deletions.
27 changes: 16 additions & 11 deletions geoalchemy2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,19 +92,23 @@ def after_parent_attach(column, table):
postgresql_ops = {column.name: "gist_geometry_ops_nd"}
else:
postgresql_ops = {}
Index(
_spatial_idx_name(table, column),
column,
postgresql_using='gist',
postgresql_ops=postgresql_ops,
_column_flag=True,
table.append_constraint(
Index(
_spatial_idx_name(table, column),
column,
postgresql_using='gist',
postgresql_ops=postgresql_ops,
_column_flag=True,
)
)
elif _check_spatial_type(column.type, Raster):
Index(
_spatial_idx_name(table, column),
func.ST_ConvexHull(column),
postgresql_using='gist',
_column_flag=True,
table.append_constraint(
Index(
_spatial_idx_name(table, column),
func.ST_ConvexHull(column),
postgresql_using='gist',
_column_flag=True,
)
)

def dispatch(current_event, table, bind):
Expand Down Expand Up @@ -236,6 +240,7 @@ def dispatch(current_event, table, bind):
col,
postgresql_using='gist',
postgresql_ops=postgresql_ops,
_column_flag=True,
)
idx.create(bind=bind)

Expand Down
3 changes: 3 additions & 0 deletions geoalchemy2/alembic_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ def add_geospatial_column(operations, operation):
geospatial_core_type.srid,
geospatial_core_type.geometry_type
))
# TODO: Add Index if geospatial_core_type.spatial_index is True
elif "postgresql" in dialect.name:
operations.add_column(
table_name,
Expand All @@ -121,6 +122,7 @@ def add_geospatial_column(operations, operation):
operation.column
)
)
# TODO: Add Index if geospatial_core_type.spatial_index is True


@Operations.implementation_for(DropGeospatialColumn)
Expand Down Expand Up @@ -149,6 +151,7 @@ def drop_geospatial_column(operations, operation):
sqlite_version = conn.execute(text("SELECT sqlite_version();")).scalar()
if parse_version(sqlite_version) >= parse_version("3.35"):
operations.drop_column(table_name, column_name)
# TODO: Drop Index?
elif "postgresql" in dialect.name:
operations.drop_column(table_name, column_name)

Expand Down
1 change: 1 addition & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ setenv=
EXPECTED_COV = 93
pypy3: EXPECTED_COV = 92
deps=
alembic
sqla11: SQLAlchemy==1.1.2
sqlalatest: SQLAlchemy
!pypy3: psycopg2
Expand Down
102 changes: 102 additions & 0 deletions tests/alembic_config/alembic.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# A generic, single database configuration.

[alembic]
# path to migration scripts
script_location = alembic

# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s

# sys.path path, will be prepended to sys.path if present.
# defaults to the current working directory.
prepend_sys_path = .

# timezone to use when rendering the date within the migration file
# as well as the filename.
# If specified, requires the python-dateutil library that can be
# installed by adding `alembic[tz]` to the pip requirements
# string value is passed to dateutil.tz.gettz()
# leave blank for localtime
# timezone =

# max length of characters to apply to the
# "slug" field
# truncate_slug_length = 40

# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false

# set to 'true' to allow .pyc and .pyo files without
# a source .py file to be detected as revisions in the
# versions/ directory
# sourceless = false

# version location specification; This defaults
# to alembic/versions. When using multiple version
# directories, initial revisions must be specified with --version-path.
# The path separator used here should be the separator specified by "version_path_separator"
# version_locations = %(here)s/bar:%(here)s/bat:alembic/versions

# version path separator; As mentioned above, this is the character used to split
# version_locations. Valid values are:
#
# version_path_separator = :
# version_path_separator = ;
# version_path_separator = space
version_path_separator = os # default: use os.pathsep

# the output encoding used when revision files
# are written from script.py.mako
# output_encoding = utf-8

# The URL will be set dynamicaly during the test initialization
; sqlalchemy.url = postgresql://gis:gis@localhost/gis
; sqlalchemy.url = sqlite:///spatialdb


[post_write_hooks]
# post_write_hooks defines scripts or Python functions that are run
# on newly generated revision scripts. See the documentation for further
# detail and examples

# format using "black" - use the console_scripts runner, against the "black" entrypoint
# hooks = black
# black.type = console_scripts
# black.entrypoint = black
# black.options = -l 79 REVISION_SCRIPT_FILENAME

# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = DEBUG
handlers = console
qualname =

[logger_sqlalchemy]
level = DEBUG
handlers =
qualname = sqlalchemy.engine

[logger_alembic]
level = INFO
handlers =
qualname = alembic

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(levelname)-5.5s [%(name)s] %(message)s
datefmt = %H:%M:%S
Loading

0 comments on commit 58de466

Please sign in to comment.