Files
django-migration-linter/django_migration_linter/sql_analyser/postgresql.py
T
2022-11-03 22:00:00 +01:00

49 lines
1.4 KiB
Python

import re
from .base import BaseAnalyser
def has_create_index(sql_statements, **kwargs):
regex_result = None
for sql in sql_statements:
regex_result = re.search(r"CREATE (UNIQUE )?INDEX.*ON (.*) \(", sql)
if re.search("INDEX CONCURRENTLY", sql):
regex_result = None
elif regex_result:
break
if not regex_result:
return False
concerned_table = regex_result.group(2)
table_is_added_in_transaction = any(
sql.startswith(f"CREATE TABLE {concerned_table}") for sql in sql_statements
)
return not table_is_added_in_transaction
class PostgresqlAnalyser(BaseAnalyser):
migration_tests = [
{
"code": "CREATE_INDEX",
"fn": has_create_index,
"msg": "CREATE INDEX locks table",
"mode": "transaction",
"type": "warning",
},
{
"code": "DROP_INDEX",
"fn": lambda sql, **kw: re.search("DROP INDEX", sql)
and not re.search("INDEX CONCURRENTLY", sql),
"msg": "DROP INDEX locks table",
"mode": "one_liner",
"type": "warning",
},
{
"code": "REINDEX",
"fn": lambda sql, **kw: sql.startswith("REINDEX"),
"msg": "REINDEX locks table",
"mode": "one_liner",
"type": "warning",
},
]