【问题标题】:Cassandra Prepared Statements error with datastax php driver使用 datastax php 驱动程序的 Cassandra Prepared Statements 错误
【发布时间】:2016-03-01 03:34:12
【问题描述】:

我在使用 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 与标准选择查询一起使用,它会起作用。

有什么建议吗?

【问题讨论】:

    标签: php cassandra prepared-statement datastax-php-driver


    【解决方案1】:

    您看到此错误是因为您只能将变量绑定到 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)
        )));
    

    【讨论】:

    • 亲爱的亚伦,非常感谢您的帮助。按照你的提示我解决了。有没有网站可以看到申请准备好的声明的详细规则?提前谢谢。
    • @omambe 这是指向 Java 驱动程序文档 (docs.datastax.com/en/developer/java-driver/2.0/java-driver/…) 的链接,其中指出:“每次执行前使用准备好的语句并将新值绑定到列。”准备好的语句背后的想法是,您要提前构建 CQL,并且只在每个查询中发送不同的列值(以提高性能)。如果您要每次都更改列、表或键空间名称,Cassandra 如何保存查询以供将来使用?
    • @omambe 您可能还会发现以下两篇博文很有帮助:datastax.com/dev/blog/…ahappyknockoutmouse.wordpress.com/2014/11/12/246
    猜你喜欢
    • 2016-02-27
    • 1970-01-01
    • 2017-01-20
    • 2019-01-31
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2018-02-15
    相关资源
    最近更新 更多