Skip to content

SQLite 驱动程序配置

驱动程序配置概述

SQLite 是一款嵌入式数据库,不需要独立的服务器进程,因此驱动程序的配置相对简单。不同编程语言提供了不同的 SQLite 驱动程序,每种驱动程序都有自己的配置方式。本文档详细介绍了常见编程语言中 SQLite 驱动程序的安装和配置方法,帮助开发人员快速上手 SQLite 数据库开发。

1. Python 驱动程序配置

1.1 内置 sqlite3 模块

Python 标准库中内置了 sqlite3 模块,无需额外安装即可使用。

使用方法:

python
import sqlite3

# 连接到数据库
conn = sqlite3.connect('database.db')

# 创建游标
cursor = conn.cursor()

# 执行 SQL 语句
cursor.execute("SELECT * FROM users")

# 获取结果
rows = cursor.fetchall()

# 关闭游标和连接
cursor.close()
conn.close()

1.2 连接参数配置

常用连接参数:

  • database:数据库文件路径或 :memory: 表示内存数据库
  • timeout:连接超时时间(秒)
  • detect_types:类型检测标志
  • isolation_level:事务隔离级别
  • check_same_thread:是否检查线程安全(默认 True

示例:

python
import sqlite3

# 配置连接参数
conn = sqlite3.connect(
    database='database.db',
    timeout=5.0,  # 超时时间 5 秒
    detect_types=sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES,
    isolation_level='DEFERRED',  # 事务隔离级别
    check_same_thread=False  # 允许跨线程使用
)

1.3 使用 SQLAlchemy ORM

SQLAlchemy 是 Python 中流行的 ORM 框架,支持 SQLite 数据库。

安装:

bash
pip install sqlalchemy

使用方法:

python
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import datetime

# 创建引擎
engine = create_engine('sqlite:///database.db')

# 创建基类
Base = declarative_base()

# 定义模型
class User(Base):
    __tablename__ = 'users'
    
    user_id = Column(Integer, primary_key=True, autoincrement=True)
    username = Column(String(50), nullable=False, unique=True)
    email = Column(String(100), nullable=False, unique=True)
    status = Column(String(20), default='inactive')
    created_at = Column(DateTime, default=datetime.datetime.now)

# 创建表
Base.metadata.create_all(engine)

# 创建会话
Session = sessionmaker(bind=engine)
session = Session()

# 添加数据
user = User(username='user1', email='user1@example.com')
session.add(user)
session.commit()

# 查询数据
users = session.query(User).all()
for user in users:
    print(user.username, user.email)

# 关闭会话
session.close()

2. JavaScript/Node.js 驱动程序配置

2.1 sqlite3 模块

sqlite3 是 Node.js 中最流行的 SQLite 驱动程序。

安装:

bash
npm install sqlite3

使用方法:

javascript
const sqlite3 = require('sqlite3').verbose();

// 打开数据库连接
const db = new sqlite3.Database('database.db', (err) => {
  if (err) {
    console.error('连接数据库失败:', err.message);
    return;
  }
  console.log('成功连接到 SQLite 数据库');
});

// 执行 SQL 语句
db.serialize(() => {
  // 创建表
  db.run(`CREATE TABLE IF NOT EXISTS users (
    user_id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL UNIQUE,
    email TEXT NOT NULL UNIQUE,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
  )`);
  
  // 插入数据
  const insert = db.prepare(`INSERT INTO users (username, email) VALUES (?, ?)`);
  insert.run('user1', 'user1@example.com');
  insert.run('user2', 'user2@example.com');
  insert.finalize();
  
  // 查询数据
  db.each(`SELECT user_id, username, email FROM users`, (err, row) => {
    if (err) {
      console.error(err.message);
      return;
    }
    console.log(`${row.user_id}: ${row.username} - ${row.email}`);
  });
});

// 关闭数据库连接
db.close((err) => {
  if (err) {
    console.error('关闭数据库连接失败:', err.message);
    return;
  }
  console.log('数据库连接已关闭');
});

2.2 使用 Sequelize ORM

Sequelize 是 Node.js 中流行的 ORM 框架,支持 SQLite 数据库。

安装:

bash
npm install sequelize sqlite3

使用方法:

javascript
const { Sequelize, DataTypes } = require('sequelize');

// 创建 Sequelize 实例
const sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: 'database.db',
  logging: console.log  // 启用日志
});

// 定义模型
const User = sequelize.define('User', {
  username: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true,
    validate: {
      isEmail: true
    }
  },
  status: {
    type: DataTypes.STRING,
    defaultValue: 'inactive'
  }
}, {
  timestamps: true // 自动添加 created_at 和 updated_at 字段
});

// 同步模型到数据库
(async () => {
  await sequelize.sync();
  console.log('模型已同步到数据库');
  
  // 添加数据
  const user = await User.create({ username: 'user1', email: 'user1@example.com' });
  console.log('创建的用户:', user.toJSON());
  
  // 查询数据
  const users = await User.findAll();
  console.log('所有用户:', users.map(user => user.toJSON()));
  
  // 关闭连接
  await sequelize.close();
})();

3. Java 驱动程序配置

3.1 SQLite JDBC 驱动

Java 使用 JDBC 驱动程序连接 SQLite 数据库。

下载驱动: 从 Maven 中央仓库下载 sqlite-jdbc 驱动,或通过 Maven/Gradle 依赖管理。

Maven 依赖:

xml
<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.45.3.0</version>
</dependency>

Gradle 依赖:

ini
dependencies {
    implementation 'org.xerial:sqlite-jdbc:3.45.3.0'
}

3.2 使用方法

示例:

java
import java.sql.*;

public class SQLiteExample {
    public static void main(String[] args) {
        // 数据库 URL
        String url = "jdbc:sqlite:database.db";
        
        // SQL 查询
        String sql = "SELECT * FROM users";
        
        try (Connection conn = DriverManager.getConnection(url);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sql)) {
            
            // 处理结果集
            while (rs.next()) {
                System.out.println("ID: " + rs.getInt("user_id"));
                System.out.println("Username: " + rs.getString("username"));
                System.out.println("Email: " + rs.getString("email"));
                System.out.println();
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

3.3 连接参数配置

常用连接参数:

  • busy_timeout:忙超时时间(毫秒)
  • journal_mode:事务日志模式
  • synchronous:同步模式
  • cache_size:缓存大小

示例:

java
import java.sql.*;
import java.util.Properties;

public class SQLiteConfigExample {
    public static void main(String[] args) {
        // 数据库 URL
        String url = "jdbc:sqlite:database.db";
        
        // 配置连接属性
        Properties props = new Properties();
        props.setProperty("busy_timeout", "5000");  // 5秒超时
        props.setProperty("journal_mode", "WAL");  // WAL模式
        props.setProperty("synchronous", "NORMAL");  // 同步模式
        props.setProperty("cache_size", "10000");  // 缓存大小
        
        try (Connection conn = DriverManager.getConnection(url, props)) {
            System.out.println("成功连接到 SQLite 数据库");
            // 执行数据库操作
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }
}

4. C# 驱动程序配置

4.1 System.Data.SQLite 驱动

System.Data.SQLite 是 C# 中常用的 SQLite 驱动程序。

安装: 通过 NuGet 包管理器安装 System.Data.SQLite

bash
dotnet add package System.Data.SQLite

4.2 使用方法

示例:

csharp
using System;
using System.Data.SQLite;

class Program
{
    static void Main()
    {
        // 连接字符串
        string connectionString = "Data Source=database.db;Version=3;";
        
        using (SQLiteConnection conn = new SQLiteConnection(connectionString))
        {
            conn.Open();
            Console.WriteLine("成功连接到 SQLite 数据库");
            
            // 创建表
            string createTableSql = @"CREATE TABLE IF NOT EXISTS users (
                user_id INTEGER PRIMARY KEY AUTOINCREMENT,
                username TEXT NOT NULL UNIQUE,
                email TEXT NOT NULL UNIQUE,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP
            )";
            
            using (SQLiteCommand cmd = new SQLiteCommand(createTableSql, conn))
            {
                cmd.ExecuteNonQuery();
            }
            
            // 插入数据
            string insertSql = "INSERT INTO users (username, email) VALUES (@username, @email)";
            using (SQLiteCommand cmd = new SQLiteCommand(insertSql, conn))
            {
                cmd.Parameters.AddWithValue("@username", "user1");
                cmd.Parameters.AddWithValue("@email", "user1@example.com");
                cmd.ExecuteNonQuery();
            }
            
            // 查询数据
            string selectSql = "SELECT * FROM users";
            using (SQLiteCommand cmd = new SQLiteCommand(selectSql, conn))
            {
                using (SQLiteDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        Console.WriteLine($"ID: {reader["user_id"]}");
                        Console.WriteLine($"Username: {reader["username"]}");
                        Console.WriteLine($"Email: {reader["email"]}");
                        Console.WriteLine();
                    }
                }
            }
        }
        
        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }
}

4.3 连接字符串参数

常用连接字符串参数:

  • Data Source:数据库文件路径
  • Version:SQLite 版本(默认 3
  • Cache Size:缓存大小(页)
  • Journal Mode:事务日志模式
  • Synchronous:同步模式
  • Busy Timeout:忙超时时间(毫秒)

示例:

csharp
string connectionString = @"Data Source=database.db;
                            Version=3;
                            Cache Size=10000;
                            Journal Mode=WAL;
                            Synchronous=NORMAL;
                            Busy Timeout=5000;";

5. Go 驱动程序配置

5.1 github.com/mattn/go-sqlite3 驱动

go-sqlite3 是 Go 语言中常用的 SQLite 驱动程序。

安装:

bash
go get github.com/mattn/go-sqlite3

5.2 使用方法

示例:

go
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/mattn/go-sqlite3"
)

func main() {
	// 打开数据库连接
	db, err := sql.Open("sqlite3", "database.db")
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 测试连接
	err = db.Ping()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("成功连接到 SQLite 数据库")

	// 创建表
	createTableSQL := `CREATE TABLE IF NOT EXISTS users (
		user_id INTEGER PRIMARY KEY AUTOINCREMENT,
		username TEXT NOT NULL UNIQUE,
		email TEXT NOT NULL UNIQUE,
		created_at DATETIME DEFAULT CURRENT_TIMESTAMP
	)`
	_, err = db.Exec(createTableSQL)
	if err != nil {
		log.Fatal(err)
	}

	// 插入数据
	insertSQL := "INSERT INTO users (username, email) VALUES (?, ?)"
	_, err = db.Exec(insertSQL, "user1", "user1@example.com")
	if err != nil {
		log.Fatal(err)
	}

	// 查询数据
	rows, err := db.Query("SELECT * FROM users")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	for rows.Next() {
		var userID int
		var username, email, createdAt string
		err := rows.Scan(&userID, &username, &email, &createdAt)
		if err != nil {
			log.Fatal(err)
		}
		fmt.Printf("ID: %d, Username: %s, Email: %s, CreatedAt: %s\n", userID, username, email, createdAt)
	}
}

6. Rust 驱动程序配置

6.1 rusqlite 驱动

rusqlite 是 Rust 语言中常用的 SQLite 驱动程序。

安装:Cargo.toml 文件中添加依赖:

toml
[dependencies]
rusqlite = "0.31.0"

6.2 使用方法

示例:

rust
use rusqlite::{Connection, Result};

#[derive(Debug)]
struct User {
    user_id: i32,
    username: String,
    email: String,
    created_at: String,
}

fn main() -> Result<()> {
    // 打开数据库连接
    let conn = Connection::open("database.db")?;
    println!("成功连接到 SQLite 数据库");

    // 创建表
    conn.execute(
        "CREATE TABLE IF NOT EXISTS users (
            user_id INTEGER PRIMARY KEY AUTOINCREMENT,
            username TEXT NOT NULL UNIQUE,
            email TEXT NOT NULL UNIQUE,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )",
        [],
    )?;

    // 插入数据
    conn.execute(
        "INSERT INTO users (username, email) VALUES (?1, ?2)",
        (&"user1", &"user1@example.com"),
    )?;

    // 查询数据
    let mut stmt = conn.prepare("SELECT * FROM users")?;
    let user_iter = stmt.query_map([], |row| {
        Ok(User {
            user_id: row.get(0)?,
            username: row.get(1)?,
            email: row.get(2)?,
            created_at: row.get(3)?,
        })
    })?;

    for user in user_iter {
        println!("{:?}", user?);
    }

    Ok(())
}

7. 通用连接配置

7.1 内存数据库

内存数据库所有数据都存储在内存中,速度非常快,适合临时数据或测试。

示例:

  • Python: sqlite3.connect(':memory:')
  • Node.js: new sqlite3.Database(':memory:')
  • Java: DriverManager.getConnection("jdbc:sqlite::memory:")
  • C#: Data Source=:memory:;Version=3;
  • Go: sql.Open("sqlite3", ":memory:")
  • Rust: Connection::open_in_memory()?

7.2 连接池配置

对于高并发场景,使用连接池可以提高性能。

Python SQLAlchemy 连接池:

python
from sqlalchemy import create_engine

# 配置连接池
engine = create_engine(
    'sqlite:///database.db',
    pool_size=5,  # 连接池大小
    max_overflow=10,  # 最大溢出连接数
    pool_timeout=30,  # 连接超时时间(秒)
    pool_recycle=3600,  # 连接回收时间(秒)
    pool_pre_ping=True  # 连接前检查
)

Node.js Sequelize 连接池:

javascript
const { Sequelize } = require('sequelize');

const sequelize = new Sequelize({
  dialect: 'sqlite',
  storage: 'database.db',
  pool: {
    max: 5,  // 最大连接数
    min: 0,  // 最小连接数
    acquire: 30000,  // 连接获取超时时间(毫秒)
    idle: 10000  // 连接空闲超时时间(毫秒)
  }
});

8. 常见问题(FAQ)

Q: 如何在不同编程语言中使用 SQLite 内存数据库?

A: 内存数据库的连接方式在不同编程语言中略有不同:

  • Python: sqlite3.connect(':memory:')
  • Node.js: new sqlite3.Database(':memory:')
  • Java: DriverManager.getConnection("jdbc:sqlite::memory:")
  • C#: Data Source=:memory:;Version=3;
  • Go: sql.Open("sqlite3", ":memory:")
  • Rust: Connection::open_in_memory()?

Q: 如何配置 SQLite 驱动程序的连接超时?

A: 不同编程语言的连接超时配置方式不同:

  • Python: sqlite3.connect('database.db', timeout=5.0)
  • Node.js: 在 sqlite3.Database 构造函数中没有直接的超时参数,需要通过 busyTimeout 方法设置
  • Java: props.setProperty("busy_timeout", "5000")
  • C#: Data Source=database.db;Version=3;BusyTimeout=5000;
  • Go: 可以通过 db.SetConnMaxLifetime()db.SetMaxIdleConns() 配置

Q: 如何启用 SQLite 的 WAL 模式?

A: 可以通过连接参数或 SQL 语句启用 WAL 模式:

  • 通过 PRAGMA 命令:PRAGMA journal_mode = WAL;
  • Java: props.setProperty("journal_mode", "WAL")
  • C#: Data Source=database.db;Version=3;Journal Mode=WAL;
  • SQLAlchemy: 在连接字符串中添加 ?journal_mode=WAL

Q: 如何处理 SQLite 驱动程序的线程安全问题?

A: 不同编程语言的线程安全处理方式不同:

  • Python: 默认 check_same_thread=True,允许跨线程使用需要设置为 False
  • Node.js: 单线程模型,无需特殊处理
  • Java: JDBC 驱动是线程安全的
  • C#: System.Data.SQLite 是线程安全的
  • Go: 连接不是线程安全的,需要使用连接池或互斥锁
  • Rust: rusqlite::Connection 不是线程安全的,需要使用 Arc<Mutex<Connection>>

Q: 如何选择合适的 SQLite 驱动程序?

A: 选择 SQLite 驱动程序时需要考虑以下因素:

  • 编程语言支持
  • 社区活跃度和维护状态
  • 性能和稳定性
  • 功能支持(如 ORM 集成、连接池等)
  • 文档质量

最佳实践总结

  1. 选择合适的驱动程序:根据编程语言和项目需求选择合适的 SQLite 驱动程序
  2. 配置合理的连接参数:根据项目需求配置连接超时、缓存大小等参数
  3. 使用连接池:对于高并发场景,使用连接池提高性能
  4. 启用 WAL 模式:对于并发场景,启用 WAL 模式提高性能
  5. 处理线程安全:根据编程语言的特点处理线程安全问题
  6. 关闭连接:使用完毕后及时关闭数据库连接,避免资源泄漏
  7. 使用参数化查询:防止 SQL 注入,提高安全性和性能
  8. 定期备份数据库:定期备份数据库,防止数据丢失

通过遵循以上最佳实践,可以确保 SQLite 驱动程序的正确配置和使用,提高数据库系统的性能和可靠性。