@@ -139,47 +139,38 @@ def create_connection(self):
139
139
raise ConnectionError (* e .args ) from e
140
140
141
141
def query_table_schema (self , path : DbPath ) -> Dict [str , tuple ]:
142
+ # Databricks has INFORMATION_SCHEMA only for Databricks Runtime, not for Databricks SQL.
143
+ # https://docs.databricks.com/spark/latest/spark-sql/language-manual/information-schema/columns.html
144
+ # So, to obtain information about schema, we should use another approach.
145
+
142
146
conn = self .create_connection ()
143
- table_schema = {}
144
147
145
- try :
146
- table_schema = super ().query_table_schema (path )
147
- except :
148
- logging .warning ("Failed to get schema from information_schema, falling back to legacy approach." )
149
-
150
- if not table_schema :
151
- # This legacy approach can cause bugs. e.g. VARCHAR(255) -> VARCHAR(255)
152
- # and not the expected VARCHAR
153
-
154
- # I don't think we'll fall back to this approach, but if so, see above
155
- catalog , schema , table = self ._normalize_table_path (path )
156
- with conn .cursor () as cursor :
157
- cursor .columns (catalog_name = catalog , schema_name = schema , table_name = table )
158
- try :
159
- rows = cursor .fetchall ()
160
- finally :
161
- conn .close ()
162
- if not rows :
163
- raise RuntimeError (f"{ self .name } : Table '{ '.' .join (path )} ' does not exist, or has no columns" )
164
-
165
- table_schema = {r .COLUMN_NAME : (r .COLUMN_NAME , r .TYPE_NAME , r .DECIMAL_DIGITS , None , None ) for r in rows }
166
- assert len (table_schema ) == len (rows )
167
- return table_schema
168
- else :
169
- return table_schema
170
-
171
- def select_table_schema (self , path : DbPath ) -> str :
172
- """Provide SQL for selecting the table schema as (name, type, date_prec, num_prec)"""
173
- database , schema , name = self ._normalize_table_path (path )
174
- info_schema_path = ["information_schema" , "columns" ]
175
- if database :
176
- info_schema_path .insert (0 , database )
177
-
178
- return (
179
- "SELECT column_name, data_type, datetime_precision, numeric_precision, numeric_scale "
180
- f"FROM { '.' .join (info_schema_path )} "
181
- f"WHERE table_name = '{ name } ' AND table_schema = '{ schema } '"
182
- )
148
+ catalog , schema , table = self ._normalize_table_path (path )
149
+ with conn .cursor () as cursor :
150
+ cursor .columns (catalog_name = catalog , schema_name = schema , table_name = table )
151
+ try :
152
+ rows = cursor .fetchall ()
153
+ finally :
154
+ conn .close ()
155
+ if not rows :
156
+ raise RuntimeError (f"{ self .name } : Table '{ '.' .join (path )} ' does not exist, or has no columns" )
157
+
158
+ d = {r .COLUMN_NAME : (r .COLUMN_NAME , r .TYPE_NAME , r .DECIMAL_DIGITS , None , None ) for r in rows }
159
+ assert len (d ) == len (rows )
160
+ return d
161
+
162
+ # def select_table_schema(self, path: DbPath) -> str:
163
+ # """Provide SQL for selecting the table schema as (name, type, date_prec, num_prec)"""
164
+ # database, schema, name = self._normalize_table_path(path)
165
+ # info_schema_path = ["information_schema", "columns"]
166
+ # if database:
167
+ # info_schema_path.insert(0, database)
168
+
169
+ # return (
170
+ # "SELECT column_name, data_type, datetime_precision, numeric_precision, numeric_scale "
171
+ # f"FROM {'.'.join(info_schema_path)} "
172
+ # f"WHERE table_name = '{name}' AND table_schema = '{schema}'"
173
+ # )
183
174
184
175
def _process_table_schema (
185
176
self , path : DbPath , raw_schema : Dict [str , tuple ], filter_columns : Sequence [str ], where : str = None
0 commit comments