java - 使用cql java驱动程序在cassandra中插入数据而不用单引号引起来

标签 java cassandra prepared-statement cql

我无法为 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='';

查看 documentationCOPY 命令上获取更多信息。可以找到示例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 中,UPDATEINSERT 都会添加一条记录(如果记录不存在),如果存在则更新(实际上称为“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/

相关文章:

java - 使用正则表达式查找斐波那契数列

ubuntu - Cassandra 节点无法相互通信

php - mysqli get_result 和 bind_result 之间的性能或安全差异?

java - 动物园管理员 + 馆长 : watch node remove/remove a watch

java - 什么正则表达式将匹配 4 位数字,一个句点,然后是一位且只有一位?

java - 在java中同时制作两个对象

java - 在 Ubuntu 16.04 中安装 cassandra 时出现 dpkg oracle Jdk 错误

python - Celery Worker 不执行 cassandra 查询

php - 准备好的报表返回获取结果和计数

java - 使用 JDBC 插入 PostgreSQL 时间类型时出错