summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/dialects/postgresql/provision.py
diff options
context:
space:
mode:
authormike bayer <mike_mp@zzzcomputing.com>2021-01-14 03:40:22 +0000
committerGerrit Code Review <gerrit@bbpush.zzzcomputing.com>2021-01-14 03:40:22 +0000
commit0e36c1bbe7c4fc83df13e756f04d9fa0fa8d5d39 (patch)
treee204b02318476336a519cd6b0016ef54c9245f0f /lib/sqlalchemy/dialects/postgresql/provision.py
parent0a41f9bea6602c52c59af0f7b572308b2c2b27ab (diff)
parentf1e96cb0874927a475d0c111393b7861796dd758 (diff)
downloadsqlalchemy-0e36c1bbe7c4fc83df13e756f04d9fa0fa8d5d39.tar.gz
Merge "reinvent xdist hooks in terms of pytest fixtures"
Diffstat (limited to 'lib/sqlalchemy/dialects/postgresql/provision.py')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/provision.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/provision.py b/lib/sqlalchemy/dialects/postgresql/provision.py
index d345cdfdf..70c390800 100644
--- a/lib/sqlalchemy/dialects/postgresql/provision.py
+++ b/lib/sqlalchemy/dialects/postgresql/provision.py
@@ -8,6 +8,7 @@ from ...testing.provision import drop_all_schema_objects_post_tables
from ...testing.provision import drop_all_schema_objects_pre_tables
from ...testing.provision import drop_db
from ...testing.provision import log
+from ...testing.provision import prepare_for_drop_tables
from ...testing.provision import set_default_schema_on_connection
from ...testing.provision import temp_table_keyword_args
@@ -102,3 +103,23 @@ def drop_all_schema_objects_post_tables(cfg, eng):
postgresql.ENUM(name=enum["name"], schema=enum["schema"])
)
)
+
+
+@prepare_for_drop_tables.for_db("postgresql")
+def prepare_for_drop_tables(config, connection):
+ """Ensure there are no locks on the current username/database."""
+
+ result = connection.exec_driver_sql(
+ "select pid, state, wait_event_type, query "
+ # "select pg_terminate_backend(pid), state, wait_event_type "
+ "from pg_stat_activity where "
+ "usename=current_user "
+ "and datname=current_database() and state='idle in transaction' "
+ "and pid != pg_backend_pid()"
+ )
+ rows = result.all() # noqa
+ assert not rows, (
+ "PostgreSQL may not be able to DROP tables due to "
+ "idle in transaction: %s"
+ % ("; ".join(row._mapping["query"] for row in rows))
+ )