如何用 BINARY_DOUBLE 类型的列反映 oracle 数据库

Posted

技术标签:

【中文标题】如何用 BINARY_DOUBLE 类型的列反映 oracle 数据库【英文标题】:How to reflect an oracle database with BINARY_DOUBLE type columns 【发布时间】:2018-09-02 04:10:27 【问题描述】:

我试图将现有的 oracle 数据库反映到 sqlalchemy 元数据中:

from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import Table

db_uri = 'oracle://USER:PASS@MYDBTNSNAME'
engine = create_engine(db_uri)

# create a MetaData instance
metadata = MetaData()

# reflect db schema to MetaData
metadata.reflect(bind=engine)

这将返回以下内容:

SAWarning: Did not recognize type 'BINARY_DOUBLE' of column 'column_1'(coltype, colname))

我尝试导入本地类型以及使用方言 oracle 中的类型

from sqlalchemy.types import *
from sqlalchemy.dialects.oracle import *

但它似乎无法识别BINARY_DOUBLE 类型

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-b69d481f6a4e> in <module>()
      1 from sqlalchemy.types import *
----> 2 from sqlalchemy.dialects.oracle import *

AttributeError: module 'sqlalchemy.dialects.oracle' has no attribute 'BINARY_DOUBLE'

我正在使用 SQLAlchemy,版本 '1.2.1'

【问题讨论】:

可能你需要this。其中提到修复为from sqlalchemy.dialects.oracle.base import ischema_namesischema_names['BINARY_DOUBLE'] = OracleBinaryDouble 这个 @TarunLalwani 我试过了。如果我没有遗漏任何内容,它只会在应用metadata.reflect() 函数后将列类型映射到NullType()。我需要将它映射到类似cx-oracle.readthedocs.io/en/latest/… 遗憾的是没有 oracle 来测试和调试它的功能 【参考方案1】:

您是否尝试过覆盖数据库中的默认映射关系?像这样

from sqlalchemy.dialects.oracle.base import BINARY_DOUBLE

group_table = sa.Table('groups', metadata,
    sa.Column('your_column', BINARY_DOUBLE(asdecimal=True)),
    autoload=True,
    include_columns=[
    'your_column',
    '...'
    ],
)

或者只是从sqlalchemy.dialects.oracle.base导入BINARY_DOBULE

我会在评论中问这个问题,但我刚刚加入,所以不能这样做。

【讨论】:

当使用metadata.reflect(bind=engine) 时,仅从sqlalchemy.dialects.oracle.base 导入BINARY_DOUBLE 会分配NullType()。因此,它并没有解决问题【参考方案2】:

如 sqlalchemy changelog 中所述,此功能已包含在版本 1.2.8 中:

[oracle] [bug] Added reflection capabilities for the oracle.BINARY_FLOAT, oracle.BINARY_DOUBLE datatypes

我已经使用 1.2.18 版本进行了检查,现在反射可以工作了。

【讨论】:

【参考方案3】:

您正在尝试使用 sqlalchemy / DB 驱动程序不太支持的列类型。所以避免这种类型。

将视图创建为(大致)SELECT * FROM base_table,稍作调整将二进制双列转换为更方便的数字类型。然后反射视图。

【讨论】:

我无法更改数据库架构。我的问题是如何让 SQLAlchemy 处理 BINARY_DOUBLE

以上是关于如何用 BINARY_DOUBLE 类型的列反映 oracle 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何用 QSqlTableModel 中的列替换行?

如何用“重复出现”的列重塑数据框?

如何用python将行排列成csv文件的列?

Excel的列数如何用数字表示?

如何用matlab画正态分布曲线

如何用 Svelte 处理相关商店