使用SQLALCHEMY设置Oracle VARCHAR2长度i Byte

时间:2019-01-31 08:22:26

标签: python oracle sqlalchemy sqldatatypes varchar2

我目前正在使用python和pandas移动一些数据。

在这里,我在现有数据库中可以读取的数据类型上有些卡住,在Byte中使用,而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 Char)的列

如何告诉sqlalchemy创建类型为VARCHAR(12 Byte)的列?

在文档中,我没有看到关于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 :(得分:1)

首先,我对sqlalchemy并不熟悉,因此,如果该框架中存在一个选项,我将一无所知。

但是,通过设置NLS参数'nls_length_semantics',例如,可以在oracle数据库会话级别对此进行控制

file_idx=3
data=nameSpeaker.([f_root_name num2str(file_idx)]).data
fs=nameSpeaker.([f_root_name num2str(file_idx)]).fs

我希望您能够在创建表之前在会话中执行此语句。

答案 1 :(得分:1)

我不知道您使用的工具,但是-就Oracle而言-您在创建表时会指定CHARBYTE,例如

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

Table created.

看看您是否可以做同样的事情。