如何编写高效且安全的SQLite操作类代码?

``python,import sqlite3,,class SQLiteHelper:, def __init__(self, db_name):, self.conn = sqlite3.connect(db_name), self.cursor = self.conn.cursor(),, def close(self):, self.conn.close(),, def execute(self, sql):, self.cursor.execute(sql), self.conn.commit(),, def fetchall(self, sql):, self.cursor.execute(sql), return self.cursor.fetchall(),``

SQLite 操作类代码

SQLite 是一个轻量级的关系型数据库管理系统,广泛应用于嵌入式系统、移动应用和桌面应用中,为了简化对 SQLite 数据库的操作,通常会封装一些常用的操作类,这些类提供了面向对象的方式来访问和管理 SQLite 数据库,使开发人员可以轻松地添加、修改、删除和查询数据。

如何编写高效且安全的SQLite操作类代码?

常见操作类示例

以下是几个常见的 SQLite 操作类示例,包括 Python、C++ 和 PHP 的实现:

Python 示例(EasySqlite)

import sqlite3
class EasySqlite:
    """
    sqlite 数据库操作工具类
    database: 数据库文件地址,db/mydb.db
    """
    _connection = None
    def __init__(self, database):
        # 连接数据库
        self._connection = sqlite3.connect(database)
    def _dict_factory(self, cursor, row):
        d = {}
        for idx, col in enumerate(cursor.description):
            d[col[0]] = row[idx]
        return d
    def execute(self, sql, args=[], result_dict=True, commit=True):
        """
        执行数据库操作的通用方法
        Args:
        sql: sql语句
        args: sql参数
        result_dict: 操作结果是否用dict格式返回
        commit: 是否提交事务
        Returns:
        list 列表,
        [{'id': 1, 'name': '张三'}, {'id': 2, 'name': '李四'}]
        """
        if result_dict:
            self._connection.row_factory = self._dict_factory
        else:
            self._connection.row_factory = None
        # 获取游标
        _cursor = self._connection.cursor()
        # 执行SQL获取结果
        _cursor.execute(sql, args)
        if commit:
            self._connection.commit()
        data = _cursor.fetchall()
        _cursor.close()
        return data

C++ 示例(SQLiteCpp)

#include <sqlite3.h>
#include <string>
class SQLiteDB {
public:
    SQLiteDB(const std::string& dbName);
    ~SQLiteDB();
    bool open();
    void close();
    bool execute(const std::string& sql);
    // Other methods...
private:
    sqlite3* db;
};
SQLiteDB::SQLiteDB(const std::string& dbName) : db(nullptr) {
    if (sqlite3_open((dbName + ".db").c_str(), &db)) {
        // handle error
    }
}
SQLiteDB::~SQLiteDB() {
    close();
}
void SQLiteDB::close() {
    if (db) {
        sqlite3_close(db);
        db = nullptr;
    }
}
bool SQLiteDB::open() {
    if (db == nullptr && sqlite3_open(":memory:", &db)) {
        // handle error
        return false;
    }
    return true;
}
bool SQLiteDB::execute(const std::string& sql) {
    char* errMsg;
    if (sqlite3_exec(db, sql.c_str(), nullptr, nullptr, &errMsg) != SQLITE_OK) {
        // handle error
        return false;
    }
    return true;
}

PHP 示例(PDOsqlite)

class PDOsqlite {
    public $dbcharset = 'utf8';
    private $dbFile = '';
    public $dbh = null;
    protected static $instanceArr = array();
    public function __construct($dbname) {
        $this>dbFile = "存放数据库文件的目录" . $dbname;
        try {
            $this>dbh = new PDO('sqlite:' . $this>dbFile);
        } catch (PDOException $e) {
            try {
                $this>dbh = new PDO('sqlite2:' . $this>dbFile);
            } catch (PDOException $e) {
                $this>outputError($e>getMessage());
            }
        }
    }
    /**
     * 单例模式
     * @param $dbname
     * @return Object
     */
    public static function getInstance($dbname) {
        if (!key_exists($dbname, self::$instanceArr)) {
            self::$instanceArr[$dbname] = new self($dbname);
        }
        return self::$instanceArr[$dbname];
    }
    /**
     * @param $tab_name  数据表名
     * @param $dataArr  需要插入的字段数组
     * @return int|void
     */
    public function insert($tab_name, $dataArr) {
        if (is_array($dataArr) && count($dataArr) > 0) {
            $key_list = '';
            $value_list = '';
            foreach ($dataArr as $key => $val) {
                $key_list .= "'" . $key . "',";
                $value_list .= "'" . $val . "',";
            }
            $key_list = '(' . rtrim($key_list, ',') . ')';
            $value_list = '(' . rtrim($value_list, ',') . ')';
            $sql = "insert into $tab_name $key_list values $value_list";
            $result = $this>dbh>exec($sql);
            $this>getPDOError();
            return $result;
        }
        return;
    }
}

相关问答FAQs

Q1: SQLite 操作类的主要作用是什么?

A1: SQLite 操作类的主要作用是提供一种面向对象的方式来访问和管理 SQLite 数据库,通过封装常用的数据库操作方法,如增、删、改、查等,可以简化开发过程,提高代码的可维护性和可重用性。

Q2: 使用 SQLite 操作类时需要注意哪些事项?

A2: 使用 SQLite 操作类时需要注意以下几点:确保数据库连接正确;在执行 SQL 语句时处理可能出现的异常;根据需要选择适当的事务管理方式;及时关闭数据库连接以释放资源。

import sqlite3
class SQLiteOperation:
    def __init__(self, db_name):
        self.conn = sqlite3.connect(db_name)
        self.cursor = self.conn.cursor()
    
    def create_table(self, create_table_sql):
        try:
            self.cursor.execute(create_table_sql)
            self.conn.commit()
            print("Table created successfully")
        except Exception as e:
            print(f"Failed to create table: {e}")
    
    def insert_data(self, insert_data_sql, data):
        try:
            self.cursor.execute(insert_data_sql, data)
            self.conn.commit()
            print("Data inserted successfully")
        except Exception as e:
            print(f"Failed to insert data: {e}")
    
    def query_data(self, query_data_sql):
        try:
            self.cursor.execute(query_data_sql)
            results = self.cursor.fetchall()
            return results
        except Exception as e:
            print(f"Failed to query data: {e}")
            return []
    
    def update_data(self, update_data_sql, data):
        try:
            self.cursor.execute(update_data_sql, data)
            self.conn.commit()
            print("Data updated successfully")
        except Exception as e:
            print(f"Failed to update data: {e}")
    
    def delete_data(self, delete_data_sql, data):
        try:
            self.cursor.execute(delete_data_sql, data)
            self.conn.commit()
            print("Data deleted successfully")
        except Exception as e:
            print(f"Failed to delete data: {e}")
    
    def close_connection(self):
        self.conn.close()
        print("Database connection closed")
使用示例
db_name = "example.db"
db = SQLiteOperation(db_name)
创建表
create_table_sql = """
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER
);
"""
db.create_table(create_table_sql)
插入数据
insert_data_sql = "INSERT INTO users (name, age) VALUES (?, ?);"
data = ('Alice', 30)
db.insert_data(insert_data_sql, data)
查询数据
query_data_sql = "SELECT * FROM users;"
results = db.query_data(query_data_sql)
print(results)
更新数据
update_data_sql = "UPDATE users SET age = ? WHERE name = ?;"
data = (35, 'Alice')
db.update_data(update_data_sql, data)
删除数据
delete_data_sql = "DELETE FROM users WHERE name = ?;"
data = ('Alice', )
db.delete_data(delete_data_sql, data)
关闭数据库连接
db.close_connection()

这个类提供了基本的数据库操作,你可以根据需要对其进行扩展,例如添加错误处理、日志记录等,在创建表和插入数据时,确保SQL语句是正确的,并且传递给函数的数据与SQL语句中的占位符相匹配。