我无法为 ASCII/Timestamp 列添加单引号,而不能为其他类型(如 Int、Decimal、Boolean 等)添加单引号。
数据来自另一个db/table,是一个sql。
我将所有列数据都作为字符串。我不想格式化每列数据以检查空值,然后决定是否放置引号。
是否可以在不使用单引号、使用准备好的语句或其他方式的情况下传递插入数据值。
最佳答案
如果您不想编写使用准备好的语句的加载程序(通过 CQL 驱动程序……这是个好主意),我可以考虑其他方法。要在不使用单引号的情况下导入,您应该能够使用 COPY FROM
CQL3 命令(将 QUOTE
参数设置为空字符串)完成此操作。如果您可以将 RDBMS 数据转储到 csv 文件,您应该能够像这样将这些值插入到 Cassandra 中:
COPY myColumnFamily (colname1,colname2,colname3)
FROM '/home/myUser/rdbmsdata.csv' WITH QUOTE='';
查看 documentation在 COPY
命令上获取更多信息。可以找到示例here .
编辑:
我还阅读了上述问题并假设您不想要基于准备好的陈述的答案。由于情况显然并非如此,我想我也会在这里提供一个(使用 DataStax 的 Java CQL 驱动程序)。请注意,此答案基于我上面示例中的列族和列名,并假定 col1
是(唯一的)主键。
PreparedStatement statement = session.prepare(
"UPDATE myKeyspace.myColumnFamily " +
"SET col2=?, col3=? " +
"WHERE col1=?");
BoundStatement boundStatement = statement.bind(
strCol2, strCol3, strCol1);
session.execute(boundStatement);
此解决方案不需要您将字符串数据封装在单引号中,并且比 String.ReplaceAll 有一些额外的好处:
- 允许您插入包含单引号的值。
- 逃避您的值(value)观,保护您免受 CQL 注入(inject)(鲜为人知的 SQL-Injection 亲戚)。
- 在 CQL 中,
UPDATE
和INSERT
都会添加一条记录(如果记录不存在),如果存在则更新(实际上称为“UPSERT”)。在INSERT
上使用UPDATE
支持计数器列(如果您的模式最终使用它们)。 - 准备好的语句速度更快,因为它们允许 Cassandra 只需解析一次查询,然后使用不同的值重新运行相同的查询。
有关更多信息,请查看 DataStax's documentation on using prepared statements with the Java Driver .
关于java - 使用cql java驱动程序在cassandra中插入数据而不用单引号引起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24943648/