Java 红移-选择查询表名称在双引号中无效

Java 红移-选择查询表名称在双引号中无效,java,unit-testing,apache-spark-sql,integration-testing,amazon-redshift,Java,Unit Testing,Apache Spark Sql,Integration Testing,Amazon Redshift,我正在编写单元测试,在这里我使用内存中的H2DB来测试逻辑。实际代码在redshift上运行,因为redshift使用psql JDBC驱动程序,我选择H2作为解决方案 但我的红移表名中包含点(“.”)运算符。 例如: select * from emp.vikas; 在单元测试中,查询失败,表示“未找到架构‘emp’”。 为了解决这个问题,我在查询中的表名中添加了双引号 但现在运行实际代码时,红移查询失败。(非单元测试) 说“关系”emp.vikas“不存在” 我的问题是,我们如何才能有一个

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

但我的红移表名中包含点(“.”)运算符。 例如:

select * from emp.vikas;
在单元测试中,查询失败,表示“未找到架构‘emp’”。 为了解决这个问题,我在查询中的表名中添加了双引号

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

我的问题是,我们如何才能有一个红移查询的运行测试用例?

在红移中,您使用
引用关系名称(表/视图等)-如果您的关系包含特殊字符(如
)或与关键字冲突(

此外,在Redshift中,您可以使用
schema.relationship\u name
符号或
database.schema.relationship\u name
引用关系。如果您的关系位于
public
架构中,或者您必须正确设置,以便Redshift知道您引用的内容,您也可以仅使用
relationship\u name

例如,如果您的红移数据库是
my_db
,模式是
my_schema
,而table
my_table
则可以这样引用它:

  • my_db.my_schema.my_table
  • my_schema.my_table
  • “我的数据库”、“我的模式”、“我的表格”
  • “我的模式”,“我的表格”
如果您的表名是my.table

  • my\u db.my\u 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”
希望这有助于在红移中使用
引用关系名称(表/视图等)-如果您的关系包含特殊字符(如
)或与关键字冲突(

此外,在红移中,您可以使用
schema.relationship\u name
符号或
database.schema.relationship\u name
引用关系。如果您的关系位于
public
schema中,或者您必须正确设置,以便Redshift知道您所指的内容,则您也可以仅使用
relationship\u name

例如,如果您的红移数据库是
my_db
,模式是
my_schema
,而table
my_table
则可以这样引用它:

  • my_db.my_schema.my_table
  • my_schema.my_table
  • “我的数据库”、“我的模式”、“我的表格”
  • “我的模式”,“我的表格”
如果您的表名是my.table

  • my\u db.my\u 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”
希望有帮助

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

您至少有以下选项:

  • 在红移上运行测试。没有其他产品会提供相同的API。建立这样一个环境有点复杂,可能会花费一些钱,但这是获得真正可靠测试的唯一方法

  • 找到一个为模拟红移而开发的产品。有些产品有本地版本。就像本地发电机一样。这个解决方案的可信度会有所不同,但对于很多用例来说,它可能已经足够了

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

  • 不要测试它。也许代码永远不会改变,也许手动测试一次就足够了,而且成本最低,也许测试所有查询字符串是否都包含引号就足够了,也许特定应用程序的这个特定部分不够关键,不足以花那么多时间编写那些非常昂贵的测试

  • 混合使用上述所有方法

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

    您至少有以下选项:

  • 在红移上运行测试。没有其他产品会提供相同的API。有点多