首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用SQLAlchemy创建Kudu表?

是否可以使用SQLAlchemy创建Kudu表?
EN

Stack Overflow用户
提问于 2021-09-16 12:41:24
回答 1查看 144关注 0票数 0

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

我已经阅读了问题及其答案,以及链接在其中的GitHub页面,但它们都是关于连接到Impala db的,我设法做到了。

(我还考虑过使用Kudu Python客户端而不是SQLAlchemy,但这不起作用,因为我的代码将运行在Ubuntu18.04上,它是不支持。)

我的问题是关于使用SQLAlchemy创建Kudu表的具体问题。当我使用普通SQL时,如下所示:

代码语言:javascript
复制
CREATE TABLE my_table (
    id INT,
    message STRING,
    PRIMARY KEY (id)
  )
  STORED AS KUDU

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

在SQLAlchemy中,将列标记为主键不是问题。但是,是否有一种方法可以在表创建调用中包括STORED AS KUDU

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-01 09:46:36

(截至2021年10月1日)(2021年10月1日)

第一: SQLAlchemy 的Impala方言是实现的,但它是在impyla包中实现的。

Impyla也应该支持Kudu,参见本期及其相关的提交。但是,从发行版0.17a8开始,包中省略了对主键约束的支持,这削弱了Kudu对Kudu的支持,因为Kudu表至少需要一个主键。

因此,要回答这个问题,使用impyla 0.17a7创建Kudu表是可能的,但不能使用以后的任何版本--同样是从2021年10月开始。我向提出了关于这件事的意见。

特征使用

Kudu支持是通过向Table()构造函数添加两个关键字参数来实现的,即impala_stored_asimpala_partition_by。在采用命令式方法并直接调用Table()时,使用是显而易见的。但是,这些参数也可以使用声明式方法很容易地传递,使用__table_args__ (它也适用于混频器)。

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

示例

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

代码语言:javascript
复制
>>> 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)示例的工作解决方案:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69208639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档