使用 SQLALCHEMY 设置 Oracle VARCHAR2 长度 i Byte
Set Oracle VARCHAR2 length i Byte using SQLALCHEMY
我目前正在使用 python 和 pandas 移动一些数据。
这里我有点卡在我可以在现有数据库中读取的数据类型是字节和 SQL Alchemy 定义是字符
例如
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
首先我不熟悉 sqlalchemy,所以如果该框架中存在一个选项我不会知道它。
然而,这可以通过设置 NLS 参数 'nls_length_semantics' 在 oracle 数据库会话级别进行控制,例如
ALTER SESSION SET nls_length_semantics = BYTE
我希望您能够在创建 table.
之前在您的会话中执行此语句
我不知道你使用的工具,但是 - 就 Oracle 而言 - 你会在创建 table 时指定 CHAR
或 BYTE
,例如
SQL> create table test
2 (col_1 varchar2 (12 char),
3 col_2 varchar2 (12 byte)
4 );
Table created.
看看你是否也能做到。
我目前正在使用 python 和 pandas 移动一些数据。
这里我有点卡在我可以在现有数据库中读取的数据类型是字节和 SQL Alchemy 定义是字符
例如
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
首先我不熟悉 sqlalchemy,所以如果该框架中存在一个选项我不会知道它。
然而,这可以通过设置 NLS 参数 'nls_length_semantics' 在 oracle 数据库会话级别进行控制,例如
ALTER SESSION SET nls_length_semantics = BYTE
我希望您能够在创建 table.
之前在您的会话中执行此语句我不知道你使用的工具,但是 - 就 Oracle 而言 - 你会在创建 table 时指定 CHAR
或 BYTE
,例如
SQL> create table test
2 (col_1 varchar2 (12 char),
3 col_2 varchar2 (12 byte)
4 );
Table created.
看看你是否也能做到。