如何用 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_names
和ischema_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 数据库的主要内容,如果未能解决你的问题,请参考以下文章