Установите длину Oracle VARCHAR2 в байтах, используя SQLALCHEMY - PullRequest
0 голосов
/ 31 января 2019

В настоящее время я перемещаю некоторые данные, используя python и pandas.

Здесь я немного застрял в типах данных, которые я могу прочитать в существующей базе данных, в байтовом, а определение SQL Alchemy в Char.

Например

from sqlalchemy.dialects.oracle import VARCHAR2

dtyp = {'COLUMN': VARCHAR2(12)}

df.to_sql(<tableName>, engine.connect(), schema=<schema>, if_exists='replace', index=False, chunksize=1000, dtype=table['dtyp'])

Это создаст столбец на моей целевой базе данных с типом VARCHAR2 (12 символов)

Как я могу сказать sqlalchemy создать столбец с типомVARCHAR (12 байт)?

Просматривая документацию, я не вижу очевидных аргументов в VARCHAR2, которые я могу установить


РЕДАКТИРОВАТЬ Я понял, как создать свой собственный тип

class BYTE_VARCHAR2(types.UserDefinedType):
def __init__(self, precision = 8):
    self.precision = precision

def get_col_spec(self, **kw):
    return "VARCHAR2(%s Byte)" % self.precision

def bind_processor(self, dialect):
    def process(value):
        return value
    return process

def result_processor(self, dialect, coltype):
    def process(value):
        return value
    return process

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Я не знаю инструментов, которые вы используете, но - что касается Oracle - вы бы указали CHAR или BYTE при создании таблицы, например,

SQL> create table test
  2    (col_1    varchar2  (12 char),
  3     col_2    varchar2  (12 byte)
  4    );

Table created.

Посмотрите, если выможет сделать то же самое.

0 голосов
/ 31 января 2019

Во-первых, я не знаком с sqlalchemy, поэтому, если в этой среде есть опция, я бы об этом не знал.

Однако это можно контролировать на уровне сеанса базы данных оракула, задав параметр NLS 'nls_length_semantics',например,

ALTER SESSION SET nls_length_semantics = BYTE

Я ожидаю, что вы сможете выполнить этот оператор в своем сеансе до создания таблицы.

...