Redshift-选择查询表名称用双引号不起作用

时间:2018-12-12 07:38:00

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

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

但是我的redshift表名称中包含点(“。”)运算符。 示例:

select * from emp.vikas;

在单元测试中,查询失败,提示“找不到模式'emp'”。 要解决此问题,我在查询的表名中添加了双引号。

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

我的问题是,我们如何为Redshift查询提供一个正在运行的测试用例?

2 个答案:

答案 0 :(得分:1)

在Redshift中,您使用"来引用关系名称(表/视图等)-如果您的关系包含特殊字符(例如.)或与关键字(group冲突,则这很有用,table)。

在Redshift中,您也可以使用schema.relation_name表示法或database.schema.relation_name来引用关系。如果您的关系位于relation_name模式中,或者您必须正确设置search path以便Redshift知道您指的是什么,也可以只使用public

例如,如果您的Redshift数据库是my_db,架构是my_schema,并且表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"

希望有帮助

答案 1 :(得分:0)

  

我们如何为Redshift查询提供一个正在运行的测试用例?

您至少具有以下选择:

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

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

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

  4. 不进行测试。也许代码永远都不会改变,也许一次完成的手动测试就足够而且最便宜,也许足以测试您的所有查询字符串是否都包含引号,也许该特定应用程序的这一特定部分对投入这么多时间并不重要编写那些非常昂贵的测试

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