0

我正在尝试配置 Superset,但是当我尝试配置新数据库以连接到 oracle 时,我遇到了问题,

Superset 使用 sqlalchemy 进行数据库连接,我将 tnsname 定义为连接并传递给 superset,如文档http://docs.sqlalchemy.org/en/rel_1_0/core/engines.html#database-urls oracle+cx_oracle://ifn: XXXXXX@DBDESA 但产生错误

(TypeError:期望 None 或字符串)

另外,我尝试与 sqlalchemy 建立连接以测试连接

    Import sqlalchemy as sa
    Eng = sa.create_engine ('oracle + cx_oracle: // ifn: XXXXXX @ DBDESA')
    Eng.execute ('select 1 from dual') fetchall ()

但是我得到了同样的错误,还有其他需要的配置吗?连接到 oracle XE 的编码或某些东西?还是超集配置中的附加参数?

Tnsnames.ora

    DBDESA =
            (Description =
                    (Address_list =
            (Address = (protocol = TCP) (host = XXX.XX.X.X) (port = 1524)))
            (Connect_data = (Service_name = dbdesa)))
4

2 回答 2

0

尽管文档说支持 oracle,但您将很难使其正常工作。

例如:

  1. Superset 假设数据库支持自动增量,而 oracle 则不支持。您将需要在 Oracle 中创建所有序列并在您的域类中添加对它们的引用。您必须在超集代码superset/models/core.py以及迁移中执行此操作superset/migrations/*(查找创建表的每个位置)。
  2. Oracle 不支持超过 30 个字符的标识符(外键或列名)。您将需要进行一些重命名。
  3. superset/migrations/env.py,之后:

if engine.name in ('sqlite', 'mysql'):
    kwargs = {
        'transaction_per_migration': True,
        'transactional_ddl': True,
 }

为 oracle 添加一个类似的块,如下所示:

if engine.name in ('oracle'):
        kwargs = {
            'transactional_ddl': True,
  }

请注意,我删除了transaction_per_migration参数。你也可以使用equals而不是“in” :)

  1. 在方言上site-packages/sqlalchemy/dialects/oracle/base.px 添加“行”作为保留字./base.py:360:RESERVED_WORDS

  2. 每次你想升级超集时再做一次。

  3. 放弃这个烂摊子,用Mysql

于 2018-05-25T09:59:10.487 回答
0

我认为URI语法可能是错误的。

请参考以下示例尝试设置URI :

oracle+cx_oracle://dbname:password@ipaddress:port/?service_name=yourtnsname

例如:

oracle+cx_oracle://test_db:test_password@10.22.3.202:1521/?service_name=hoge
于 2017-10-18T05:11:08.547 回答