blob: 11be2a6ca9afc383e351d19164bc357799961919 [file] [log] [blame]
"""Integration between SQLAlchemy and Trino.
Some code based on
https://github.com/zzzeek/sqlalchemy/blob/rel_0_5/lib/sqlalchemy/databases/sqlite.py
which is released under the MIT license.
"""
from __future__ import absolute_import
from __future__ import unicode_literals
import re
from sqlalchemy import exc
from sqlalchemy import types
from sqlalchemy import util
# TODO shouldn't use mysql type
try:
from sqlalchemy.databases import mysql
mysql_tinyinteger = mysql.MSTinyInteger
except ImportError:
# Required for SQLAlchemy>=2.0
from sqlalchemy.dialects import mysql
mysql_tinyinteger = mysql.base.MSTinyInteger
from sqlalchemy.engine import default
from sqlalchemy.sql import compiler
from sqlalchemy.sql.compiler import SQLCompiler
from pyhive import trino
from pyhive.common import UniversalSet
from pyhive.sqlalchemy_presto import PrestoDialect, PrestoCompiler, PrestoIdentifierPreparer
class TrinoIdentifierPreparer(PrestoIdentifierPreparer):
pass
_type_map = {
'boolean': types.Boolean,
'tinyint': mysql_tinyinteger,
'smallint': types.SmallInteger,
'integer': types.Integer,
'bigint': types.BigInteger,
'real': types.Float,
'double': types.Float,
'varchar': types.String,
'timestamp': types.TIMESTAMP,
'date': types.DATE,
'varbinary': types.VARBINARY,
}
class TrinoCompiler(PrestoCompiler):
pass
class TrinoTypeCompiler(PrestoCompiler):
def visit_CLOB(self, type_, **kw):
raise ValueError("Trino does not support the CLOB column type.")
def visit_NCLOB(self, type_, **kw):
raise ValueError("Trino does not support the NCLOB column type.")
def visit_DATETIME(self, type_, **kw):
raise ValueError("Trino does not support the DATETIME column type.")
def visit_FLOAT(self, type_, **kw):
return 'DOUBLE'
def visit_TEXT(self, type_, **kw):
if type_.length:
return 'VARCHAR({:d})'.format(type_.length)
else:
return 'VARCHAR'
class TrinoDialect(PrestoDialect):
name = 'trino'
supports_statement_cache = False
@classmethod
def dbapi(cls):
return trino
@classmethod
def import_dbapi(cls):
return trino