【问题标题】:Redshift - select query table name is in double quotes does not workRedshift - 选择查询表名在双引号中不起作用
【发布时间】:2019-05-13 06:30:14
【问题描述】:

我正在编写单元测试,我使用内存中的 H2 DB 来测试逻辑。实际代码在 redshift 上运行,因为 redshift 使用 psql JDBC 驱动程序,我选择 H2 作为解决方法。

但我的 redshift 表名中包含点 (".") 运算符。 示例:

select * from emp.vikas;

在单元测试中,查询失败并显示“未找到模式 'emp'”。 作为一种解决方法,我在查询中的表名中添加了双引号。

但是现在运行实际代码时,redshift 查询会失败。 (不是单元测试) 说“关系“emp.vikas”不存在”

我的问题是,我们如何才能为 redshift 查询运行测试用例?

【问题讨论】:

  • 单引号在某些情况下有效,不确定您的情况
  • 没有。单引号在 redshift 上也会失败。

标签: java unit-testing apache-spark-sql integration-testing amazon-redshift


【解决方案1】:

我们怎样才能有一个运行红移查询的测试用例?

您至少有以下选择:

  1. 在 redshift 上运行测试。没有其他产品会为您提供相同的 API。设置这样的环境有点复杂,可能会花费一些钱,但这是获得真正可靠测试的唯一方法

  2. 查找开发用于模拟红移的产品。有些产品有本地版本。像本地 DynamoDB,motolocalstack。此解决方案的置信度会有所不同,但对于许多用例来说可能就足够了

  3. 让您的代码足够智能以适应不同的存储。如果您知道 API/查询的差异是微不足道的,请不要对查询进行硬编码,而是使用某种查询构建器/翻译器来检测存储并使用适当的方言转换查询(例如添加引号)。这部分代码不会在您的生产存储上进行测试,但它可能足够小并且很少更改,因此不值得花钱进行适当的实际存储测试

  4. 不要测试它。也许该代码永远不会改变,也许手动测试一次就足够且成本最低,也许测试所有查询字符串是否包含引号就足够了,也许该特定应用程序的这个特定部分不够重要,无法投入这么多时间编写那些相当昂贵的测试

  5. 混合使用上述所有方法

【讨论】:

    【解决方案2】:

    在 Redshift 中,您使用 " 引用关系名称(表/视图等) - 如果您的关系包含特殊字符(如 .)或与关键字(grouptable)冲突,这将非常有用。

    同样在 Redshift 中,您可以使用 schema.relation_name 表示法或 database.schema.relation_name 来引用关系。如果您的关系位于 public 架构中,或者当您必须正确设置 search path 以便 Redshift 知道您所指的内容时,您也可以只使用 relation_name

    比如你的Redshift数据库是my_db,schema是my_schema,table是my_table,你可以这样引用:

    • my_db.my_schema.my_table
    • my_schema.my_table
    • "my_db"."my_schema"."my_table"
    • "my_schema"."my_table"

    如果你的表名是my.table,你必须引用它:

    • my_db.my_schema."my.table"
    • my_schema."my.table"
    • "my_db"."my_schema"."my.table"
    • "my_schema"."my.table"

    如果你使用public 模式并且你的表名是emp.vikas 那么你引用它:

    • my_db.public."emp.vikas"
    • public."emp.vikas"
    • "emp.vikas"

    如果您的架构名称是 emp 并且您的表名称是 vikas 并且您使用 my_db 数据库,那么您可以将您的表称为:

    • my_db.emp.vikas
    • emp.vikas
    • "my_db"."emp"."vikas"
    • "emp"."vikas"

    希望对你有帮助

    【讨论】:

    • 感谢 botchniaque,但 select * from "emp.vikas" 在红移中不起作用。另外,我正在运行 spark java 代码,使用 api 调用 sparkSession.sqlContext().read 从 redshift 读取数据。在那里我无法设置 search_path(使用的命令:set search_path = emp),因为 search_path 适用于特定会话。
    • 如果你的架构是emp,你的表是vikas,那么你应该引用"emp"."vikas"——我刚刚修改了最后一个例子来说明这一点。
    猜你喜欢
    • 2022-01-17
    • 2020-03-22
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多