【问题标题】:Is it possible to create a Kudu table using SQLAlchemy?是否可以使用 SQLAlchemy 创建 Kudu 表?
【发布时间】:2021-11-11 11:01:07
【问题描述】:

我在 Impala 中有一个数据库,我需要在其中使用 Kudu 表。 我想在我的 Python 代码中使用 SQLAlchemy 与数据库进行交互。 尽管 Impala 不是 SQLALchemy 中支持的方言,但我已经能够访问数据并在我现有的 Kudu 和非 Kudu 表中进行基本修改。

我已经阅读了this 问题及其答案以及那里链接的 GitHub 页面,但它们是关于连接到 Impala 数据库的,我设法做到了。

(我也考虑过使用 Kudu Python Client 代替 SQLAlchemy,但这不起作用,因为我的代码将在 Ubuntu 18.04 上运行并且它是 not supported。)

我的问题是关于使用 SQLAlchemy 创建 Kudu 表的。 当我使用纯 SQL 时,它看起来像这样:

CREATE TABLE my_table (
    id INT,
    message STRING,
    PRIMARY KEY (id)
  )
  STORED AS KUDU

有两件事表明这是一个 Kudu 表:主键的存在,这在 Impala 中不存在,当然还有最后一行。

在 SQLAlchemy 中将列标记为主键不是问题。但是有没有办法在表创建调用中包含STORED AS KUDU

【问题讨论】:

    标签: python sqlalchemy impala kudu


    【解决方案1】:

    Kudu 支持存在但存在问题(截至 2021 年 10 月 1 日)

    首先:SQLAlchemy 的 Impala 方言已实现,但在 impyla 包中。

    Impyla 也应该支持 Kudu,请参阅 this issue 和与之相关的提交。但是,从发布 0.17a8 开始,包中省略了对主键约束的支持,这削弱了对 Kudu 的支持,因为 Kudu 表需要至少有一个主键。

    所以要回答这个问题,可以使用 impyla 0.17a7 创建 Kudu 表,但不能使用任何后续版本 - 再次,截至 2021 年 10 月。我就此事提交了 this 问题。

    功能使用

    Kudu 支持是通过在Table() 构造函数中添加两个关键字参数来实现的,即impala_stored_asimpala_partition_by。采用命令式方法并直接调用Table() 时,用法很明显。但是,使用 __table_args__(也适用于 mixins)也可以使用声明式方法轻松传递参数。

    有关命令式和声明式映射的说明,请参阅 SQLAlchemy 文档的this page。 有关工作示例,请参阅下一节。

    示例

    一个命令式示例,取自here,但具有固定的参数名称和主键:

    >>> import sqlalchemy
    >>> engine = sqlalchemy.create_engine('impala://node-1.cluster')
    >>> table = sqlalchemy.Table('sweet_new_table', sqlalchemy.MetaData(), sqlalchemy.Column('id', sqlalchemy.Integer, primary_key=True), impala_stored_as='KUDU')
    >>> print(str(sqlalchemy.schema.CreateTable(table, bind=engine)))
    
    CREATE TABLE sweet_new_table (
        id INTEGER,
        PRIMARY KEY (id)
    )
    STORED AS KUDU
    

    我的声明式 (ORM) 示例的工作解决方案:

    import sqlalchemy
    from sqlalchemy.orm import declarative_base
    from sqlalchemy import Column, String
    
    Base = declarative_base()
    
    class MyTable(Base):
        __tablename__ = "my_table_name"
        __table_args__ = {"impala_stored_as": "KUDU"}
    
        id = Column(String, primary_key=True)
    
    
    if __name__ == "__main__":
        engine = sqlalchemy.create_engine("impala://node-1.cluster")
        Base.metadata.create_all(engine)
    

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 2016-08-04
      • 2020-04-03
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多