|
164 | 164 | from sqlalchemy import types as sqltypes |
165 | 165 |
|
166 | 166 | from sqlalchemy.schema import Table, Column, MetaData |
167 | | -from sqlalchemy.dialects.oracle import base as oracle_dialect |
168 | 167 | from sqlalchemy.dialects.mssql import base as mssql_dialect |
| 168 | +from sqlalchemy.dialects.oracle import base as oracle_dialect |
169 | 169 | from sqlalchemy.dialects.postgresql.base import ( |
170 | | - ARRAY, ischema_names, PGDialect, NUMERIC, SMALLINT) |
| 170 | + ARRAY, ischema_names, PGDialect, NUMERIC, SMALLINT, VARCHAR, TIMESTAMP, BYTEA, BOOLEAN, TEXT) |
171 | 171 | import re |
172 | 172 | import operator |
173 | 173 |
|
@@ -217,9 +217,30 @@ def _parse_url_from_options(fdw_options): |
217 | 217 | ('<>', False): not_(sqlops.in_op) |
218 | 218 | } |
219 | 219 |
|
| 220 | +def basic_converter(new_type): |
| 221 | + def converter(c): |
| 222 | + old_args = c.type.__dict__ |
| 223 | + c.type = new_type() |
| 224 | + c.type.__dict__.update(old_args) |
| 225 | + return converter |
| 226 | + |
| 227 | +def length_stripper(new_type): |
| 228 | + first = basic_converter(new_type) |
| 229 | + def converter(c): |
| 230 | + first(c) |
| 231 | + c.type.__dict__['length'] = None |
| 232 | + return converter |
| 233 | + |
220 | 234 | CONVERSION_MAP = { |
221 | | - oracle_dialect.NUMBER: NUMERIC, |
222 | | - mssql_dialect.TINYINT: SMALLINT |
| 235 | + oracle_dialect.NUMBER: basic_converter(NUMERIC), |
| 236 | + |
| 237 | + mssql_dialect.TINYINT: basic_converter(SMALLINT), |
| 238 | + mssql_dialect.NVARCHAR: basic_converter(VARCHAR), |
| 239 | + mssql_dialect.DATETIME: basic_converter(TIMESTAMP), |
| 240 | + mssql_dialect.VARBINARY: basic_converter(BYTEA), |
| 241 | + mssql_dialect.IMAGE: basic_converter(BYTEA), |
| 242 | + mssql_dialect.BIT: basic_converter(BOOLEAN), |
| 243 | + mssql_dialect.TEXT: length_stripper(TEXT) |
223 | 244 | } |
224 | 245 |
|
225 | 246 | SORT_SUPPORT = { |
@@ -490,10 +511,8 @@ def import_schema(self, schema, srv_options, options, |
490 | 511 | # If the type is specialized, call the generic |
491 | 512 | # superclass method |
492 | 513 | if type(c.type) in CONVERSION_MAP: |
493 | | - class_name = CONVERSION_MAP[type(c.type)] |
494 | | - old_args = c.type.__dict__ |
495 | | - c.type = class_name() |
496 | | - c.type.__dict__.update(old_args) |
| 514 | + converter = CONVERSION_MAP[type(c.type)] |
| 515 | + converter(c) |
497 | 516 | if c.primary_key: |
498 | 517 | ftable.options['primary_key'] = c.name |
499 | 518 | ftable.columns.append(ColumnDefinition( |
|
0 commit comments