使用 SQLALCHEMY 设置 Oracle VARCHAR2 长度 i Byte

Posted

技术标签:

【中文标题】使用 SQLALCHEMY 设置 Oracle VARCHAR2 长度 i Byte【英文标题】:Set Oracle VARCHAR2 length i Byte using SQLALCHEMY 【发布时间】:2019-06-24 15:39:53 【问题描述】:

我目前正在使用 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

【问题讨论】:

相关***.com/questions/45448856/… 考虑编写自己的答案,而不是在问题中回答。 【参考方案1】:

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

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

Table created.

看看你能不能这样做。

【讨论】:

这基本上是我通过创建自定义数据类型完成的 好吧,我很高兴你成功了。【参考方案2】:

首先我不熟悉 sqlalchemy,所以如果该框架中存在一个选项,我不会知道。

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

ALTER SESSION SET nls_length_semantics = BYTE

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

【讨论】:

以上是关于使用 SQLALCHEMY 设置 Oracle VARCHAR2 长度 i Byte的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy怎么在Oracle中自动建立映射

在 SQLAlchemy 中使用 Oracle 服务名称

使用 SQLAlchemy 连接到 Oracle 数据库

Oracle 表未拥有的 SqlAlchemy 反映

使用 SqlAlchemy 执行返回 REF CURSOR 的 Oracle 存储过程

sqlalchemy @hybrid_property v @property,@hybrid_method v @classmethod