3.2 csdbc - 数据库操作

December 8, 2025 · View on GitHub

csdbc 提供了统一的数据库访问接口,支持 SQLite、MySQL 等数据库。

安装

cspkg install csdbc

SQLite 基础操作

import csdbc_sqlite as csdbc

# 连接到 SQLite 数据库
var db = csdbc.connect("mydata.db")

# 创建表
var create_sql = "CREATE TABLE IF NOT EXISTS users (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "name TEXT NOT NULL, " +
                "email TEXT UNIQUE, " +
                "age INTEGER)"
db.just_exec(create_sql)

# 插入数据 - 使用预处理语句
var stmt = db.prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)")
stmt.bind(1, "Alice")
stmt.bind(2, "alice@example.com")
stmt.bind(3, 25)
stmt.just_exec()

# 批量插入 - 重用预处理语句以提高性能
var users = {
    {"Bob", "bob@example.com", 30},
    {"Charlie", "charlie@example.com", 35}
}

var insert_stmt = db.prepare("INSERT INTO users (name, email, age) VALUES (?, ?, ?)")
foreach user in users
    insert_stmt.bind(1, user[0])
    insert_stmt.bind(2, user[1])
    insert_stmt.bind(3, user[2])
    insert_stmt.just_exec()
end

system.out.println("数据插入成功")

# 查询数据
var query_stmt = db.prepare("SELECT * FROM users")
var result = query_stmt.exec()

system.out.println("用户列表:")
foreach row in result
    system.out.print("ID: " + row[0])
    system.out.print(", 姓名: " + row[1])
    system.out.print(", 邮箱: " + row[2])
    system.out.println(", 年龄: " + row[3])
end

# 更新数据
var update_stmt = db.prepare("UPDATE users SET age = ? WHERE name = ?")
update_stmt.bind(1, 26)
update_stmt.bind(2, "Alice")
update_stmt.just_exec()
system.out.println("数据更新成功")

# 删除数据
var delete_stmt = db.prepare("DELETE FROM users WHERE age > ?")
delete_stmt.bind(1, 30)
delete_stmt.just_exec()
system.out.println("数据删除成功")

事务处理

import csdbc_sqlite as csdbc

var db = csdbc.connect("mydata.db")

# 创建账户表
db.just_exec("CREATE TABLE IF NOT EXISTS accounts (id INTEGER PRIMARY KEY, name TEXT, balance INTEGER)")

try
    # 开始事务
    db.just_exec("BEGIN TRANSACTION")
    
    # 执行多个操作
    var stmt1 = db.prepare("INSERT INTO accounts (name, balance) VALUES (?, ?)")
    stmt1.bind(1, "账户A")
    stmt1.bind(2, 1000)
    stmt1.just_exec()
    
    var stmt2 = db.prepare("INSERT INTO accounts (name, balance) VALUES (?, ?)")
    stmt2.bind(1, "账户B")
    stmt2.bind(2, 500)
    stmt2.just_exec()
    
    # 转账操作
    var stmt3 = db.prepare("UPDATE accounts SET balance = balance - ? WHERE name = ?")
    stmt3.bind(1, 200)
    stmt3.bind(2, "账户A")
    stmt3.just_exec()
    
    var stmt4 = db.prepare("UPDATE accounts SET balance = balance + ? WHERE name = ?")
    stmt4.bind(1, 200)
    stmt4.bind(2, "账户B")
    stmt4.just_exec()
    
    # 提交事务
    db.just_exec("COMMIT")
    system.out.println("事务提交成功")
    
catch e
    # 发生错误时回滚
    db.just_exec("ROLLBACK")
    system.out.println("事务回滚: " + to_string(e))
end

MySQL 连接

import csdbc

# 连接到 MySQL
var db = csdbc.connect("mysql", {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "password",
    "database": "mydb"
})

try
    # 执行查询
    var result = db.query("SELECT * FROM products WHERE price > ?", {100})
    
    foreach product in result
        system.out.println("产品: " + product["name"] +
                         ", 价格: " + to_string(product["price"]))
    end
    
catch e
    system.out.println("查询失败: " + to_string(e))
finally
    db.close()
end

ORM 风格的数据访问

import csdbc

class UserModel
    var db = null
    
    function construct(database)
        this.db = database
    end
    
    function findAll()
        return this.db.query("SELECT * FROM users")
    end
    
    function findById(id)
        var result = this.db.query("SELECT * FROM users WHERE id = ?", {id})
        if result.size > 0
            return result[0]
        else
            return null
        end
    end
    
    function findByName(name)
        return this.db.query("SELECT * FROM users WHERE name LIKE ?", {"%" + name + "%"})
    end
    
    function create(name, email, age)
        this.db.execute("INSERT INTO users (name, email, age) VALUES (?, ?, ?)",
                       {name, email, age})
        return this.db.lastInsertId()
    end
    
    function update(id, data)
        var sets = new list
        var values = new list
        
        foreach key in data.keys()
            sets.push_back(key + " = ?")
            values.push_back(data[key])
        end
        
        values.push_back(id)
        
        var sql = "UPDATE users SET " + join(sets, ", ") + " WHERE id = ?"
        this.db.execute(sql, values)
    end
    
    function delete(id)
        this.db.execute("DELETE FROM users WHERE id = ?", {id})
    end
end

# 使用模型
var db = csdbc.connect("sqlite", "mydata.db")
var userModel = new UserModel{db}

# 创建用户
var userId = userModel.create("David", "david@example.com", 28)
system.out.println("创建用户 ID: " + to_string(userId))

# 查询用户
var user = userModel.findById(userId)
if user != null
    system.out.println("找到用户: " + user["name"])
end

# 更新用户
userModel.update(userId, {"age": 29})

# 删除用户
userModel.delete(userId)

db.close()