Source code for pyathena.sqlalchemy.preparer
from __future__ import annotations
from typing import TYPE_CHECKING
from sqlalchemy.sql.compiler import ILLEGAL_INITIAL_CHARACTERS, IdentifierPreparer
from pyathena.sqlalchemy.constants import DDL_RESERVED_WORDS, SELECT_STATEMENT_RESERVED_WORDS
if TYPE_CHECKING:
from sqlalchemy import Dialect
[docs]
class AthenaDMLIdentifierPreparer(IdentifierPreparer):
"""Identifier preparer for Athena DML (SELECT, INSERT, etc.) statements.
This preparer handles quoting and escaping of identifiers in DML statements.
It uses double quotes for identifiers and recognizes Athena's SELECT
statement reserved words to determine when quoting is necessary.
Athena's DML syntax follows Presto/Trino conventions, which differ from
DDL syntax (which uses Hive conventions with backticks).
See Also:
:class:`AthenaDDLIdentifierPreparer`: Preparer for DDL statements.
AWS Athena Reserved Words:
https://docs.aws.amazon.com/athena/latest/ug/reserved-words.html
"""
reserved_words: set[str] = SELECT_STATEMENT_RESERVED_WORDS
[docs]
class AthenaDDLIdentifierPreparer(IdentifierPreparer):
"""Identifier preparer for Athena DDL (CREATE, ALTER, DROP) statements.
This preparer handles quoting and escaping of identifiers in DDL statements.
It uses backticks for identifiers (Hive convention) rather than double
quotes (Presto/Trino convention used in DML).
Key differences from DML preparer:
- Uses backtick (`) as the quote character
- Recognizes DDL-specific reserved words
- Treats underscore (_) as an illegal initial character
See Also:
:class:`AthenaDMLIdentifierPreparer`: Preparer for DML statements.
AWS Athena DDL Reserved Words:
https://docs.aws.amazon.com/athena/latest/ug/reserved-words.html
"""
reserved_words = DDL_RESERVED_WORDS
illegal_initial_characters = ILLEGAL_INITIAL_CHARACTERS.union("_")
[docs]
def __init__(
self,
dialect: Dialect,
initial_quote: str = "`",
final_quote: str | None = None,
escape_quote: str = "`",
quote_case_sensitive_collations: bool = True,
omit_schema: bool = False,
):
super().__init__(
dialect=dialect,
initial_quote=initial_quote,
final_quote=final_quote,
escape_quote=escape_quote,
quote_case_sensitive_collations=quote_case_sensitive_collations,
omit_schema=omit_schema,
)