当前位置: 首页 > 知识库问答 >
问题:

Cassandra准备的语句与datastax php驱动程序出错

谢承
2023-03-14

我在使用DataStax php驱动程序1.0.0-rc和Cassandra 2.2.3的Prepared Statements时遇到了一个奇怪的错误。我在这一行遇到了一条异常:

$statement = $this->session->prepare("SELECT ? FROM ? WHERE ? = ?");

我看到了这个错误:

"error_code":33562624
"error_message":"Bind variables cannot be used for keyspace names"

下面是用于与Cassandra通信的类存根:

class ClsCassandra extends ClsDbObject
{
    private $hostname="";
    private $username="";
    private $password="";
    private $keyspace="";
    private $poi_table="";
    private $poi_table_key_field="";
    private $poi_table_content_field="";

    private $cluster = NULL;
    private $session = NULL;

    private $threads = 1;

    function __construct()
    {
        ...
        ...
        //
        // i set up all the properties above
        //
        ...
        ...
    }

    public function runQuery(&$error)
    {
        try 
        {           
            $this->cluster   = Cassandra::cluster()
            ->withContactPoints($this->hostname)
            ->withCredentials($this->username, $this->password)
            ->withIOThreads($this->threads)
            ->build();

            $this->session = $this->cluster->connect($this->keyspace);

            // error on next line...
            $statement = $this->session->prepare("SELECT ? FROM ? WHERE ? = ?");
            $results = $this->session->execute($statement, new Cassandra\ExecutionOptions(array(
                    'arguments' => array($this->poi_table_content_field, $this->poi_table, $this->poi_table_key_field, $keypattern)
            )));

        }
        catch(Cassandra\Exception $ce)
        {
            $error->setError($ce->getCode(), $ce->getMessage(), $ce->getTraceAsString());
            $this->log(LOG_LEVEL, $error->getErrorMessage(), __FILE__, __LINE__, __CLASS__);
            return false;
        }
        return true;
    }

    ...
    ...
    ...
}

如果我将Simple Statemetn与标准select查询一起使用,它会起作用。

有什么建议吗?

共有1个答案

艾安和
2023-03-14

您看到此错误是因为您只能将变量绑定到WHERE子句。预准备语句机制不仅仅是美化了的字符串格式化程序。它有关于什么可以和不可以绑定的规则,以及当发送给Cassandra时,如何绑定东西以消除任何歧义。

你需要尝试这样的事情:

$statement = $this->session->prepare(
    "SELECT key1, key2, col1, col2 FROM yourKeyspaceName.yourTableName WHERE key1 = ? AND key2 = ?");
$results = $this->session->execute($statement, new Cassandra\ExecutionOptions(array(
    'arguments' => array($key1,$key2)
    )));
 类似资料:
  • 用于cassandra的Datastax Java驱动程序(cassandra-driver-core 2.0.2)支持PreparedStatements以及QueryBuilder API。使用其中一种比另一种有什么特别的优势吗?缺点? 文档:http://www.datastax.com/documentation/developer/java-driver/2.0/common/drive

  • 对于cassandra driver 4.0.0(com.datastax.oss/java driver core/4.0.0),PreparedStatement(仅在现有的情况下)使用100%的CPU节点,即使应用程序处于空闲状态: cassandra driver 3.7.1(com.datasax.cassandra/cassandra driver core/3.7.1)的相同Prep

  • 我想知道使用比有什么好处? 最简单的方法是: 如您所见,我可以将数据绑定到< code>preparedStatement而无需< code>boundStatements。< code>boundStatement在哪里有用?

  • 我试图了解MySQL JDBC驱动程序中的客户端仿真准备语句是如何工作的。 第1部分我在网上读到,对于准备好的语句,关系数据库处理JDBC/SQL查询时涉及四个步骤,它们如下: 分析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取并返回数据 如果客户端仿真准备好的语句没有往返数据库,那么它如何执行步骤3?还是客户端仿真准备语句的工作方式不同? 第二部分我还做了两个实验

  • 使用卡桑德拉准备语句时,将字段与静态值绑定是否有任何好处? 例如,即使我总是使用静态值“Active”,status是否也应该有一个bind变量?如果是,为什么? 更新用户设置status='Active',其中user_id=:userid

  • 在schema中添加了一对列之后,我想通过< code>select *来选择它们。相反,< code>select *返回旧的列集,而不返回新的列集。 根据文档建议,我使用{prepare:true}来平滑JavaScript浮点数和卡桑德拉整数/bigints差异(我真的不需要这里准备好的语句,它只是为了解决这个响应错误:预期的4或0字节int问题,我也不想用来打扰自己)。 所以在第一次执行<