有什么好方法可以直接将字节码传递给sqlite3吗?

时间:2020-11-08 18:14:49

标签: sqlite

我正在开发一个工具,该工具允许Python开发人员编写pythonic代码以与sqlite3数据库进行交互,类似于sqlalchemy,但没有“翻译”阶段。如果我可以生成sqlite3准备好的语句,该如何直接将其传递给评估系统?

作为一个粗略的例子,这是我粗略地查看用户能够与我的工具进行交互的方式:

<?php 
session_start();
if (isset($_SESSION['userid'])) {
 $money = json_decode(file_get_contents('php://input'), true);
 $money_as_number = intval( $money );
 $userid = $_SESSION['userid'];
try {
$db = DB();

$stmt = $db->prepare("UPDATE usersystem SET money=:money WHERE userid=:userid");
$stmt->bindValue(':money', $money_as_number, PDO::PARAM_INT);
$stmt->bindValue(':userid', $userid, PDO::PARAM_STR);
$stmt->execute();

}
    catch(PDOException $e)
    {
        $db = null;  
        echo $e->getMessage();  
    }
    }
    ?>

1 个答案:

答案 0 :(得分:0)

SQLite3中没有(公共)API,允许您执行预构建的SQLite字节码。可以使用EXPLAIN SQL命令查看SQL语句的字节码,但这是出于调试和学习目的,而不是您要尝试执行的操作。

对于大多数目的,您不需要此。如果您认为花费大量时间来编写准备好的语句,可以在创建它的sqlite3_stmt数据库连接的整个生命周期内存储sqlite3个对象。已执行的准备好的语句可以为reset,从而可以再次执行它们。因此,只要存在数据库连接,您就可以编译该语句一次,并根据需要使用它多次。

但是就是这样。没有机制可以在sqlite3连接的生命周期之外保留准备好的语句。您不能通过任何公共API提取字节码,也不能使用获得的某些字节码来重新构成准备好的语句。

如果要在连接之外进行持久化,则需要将SQL语句 text 存储在要持久化的任何位置,然后在重新连接到数据库时简单地重新编译准备好的语句。取决于应用程序的寿命,一次重新编译(或多次重新编译取决于存储的数量)不是特别的负担。