sqlite数据库怎么连接
- 数据库
- 2025-08-11
- 10
SQLite基础认知
SQLite是一款轻量级关系型数据库管理系统(RDBMS),其核心特性包括:
零配置依赖:无需独立服务器进程,直接通过本地文件存储数据;
跨平台兼容:支持Windows/Linux/macOS等主流操作系统;
ACID事务:保证数据操作的原子性、一致性、隔离性和持久性;
标准SQL语法:兼容大部分ANSI SQL规范,学习成本低。
典型应用场景:移动应用本地存储、小型桌面软件数据管理、测试环境快速搭建、嵌入式系统开发等。
主流编程语言连接方案对比表
| 语言 | 核心依赖包 | 连接核心逻辑 | 典型用途 |
|---|---|---|---|
| Python | sqlite3(内置) | conn = sqlite3.connect('test.db') | 脚本开发、数据分析原型设计 |
| Java | JDBC + sqlite-jdbc | DriverManager.getConnection("jdbc:sqlite:test.db") | Android应用、企业级后端服务 |
| C/C++ | SQLite3动态库 | sqlite3_open("test.db", &db); | 高性能场景、IoT设备开发 |
| .NET(C#) | System.Data.SQLite | new SQLiteConnection("Data Source=test.db") | Windows桌面应用、游戏开发 |
| Node.js | better-sqlite3 | new Database('test.db') | 全栈Web开发、微服务架构 |
分步详解:Python连接SQLite全流程
环境准备
- 无需额外安装:Python标准库已包含sqlite3模块;
- 验证版本:在终端输入python --version确认Python环境正常。
创建/打开数据库
import sqlite3 # 自动创建数据库文件(若不存在) conn = sqlite3.connect('my_database.db') # 当前目录下生成db文件 cursor = conn.cursor() # 获取游标对象
️ 关键注意:路径可指定绝对路径(如/data/project/db.sqlite),相对路径基于当前工作目录。
执行SQL语句
# 创建用户表 cursor.execute('''CREATE TABLE IF NOT EXISTS users( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )''') # 插入测试数据 cursor.execute("INSERT INTO users (name, email) VALUES (?, ?)", ("张三", "zhangsan@example.com")) conn.commit() # 必须提交事务才能生效!
参数化查询:使用占位符防止SQL载入,比字符串拼接更安全。

查询与结果处理
# 查询所有用户 cursor.execute("SELECT FROM users") rows = cursor.fetchall() # 获取全部结果集 for row in rows: print(f"ID:{row[0]}, Name:{row[1]}, Email:{row[2]}") # 带条件的查询 cursor.execute("SELECT FROM users WHERE name LIKE ?", ("张%",)) first_result = cursor.fetchone() # 只取第一条记录
游标类型:除fetchall()外,还有fetchmany(size)(分批获取)、fetchone()(单条记录)。
关闭连接
cursor.close() # 先关闭游标 conn.close() # 最后关闭连接
资源释放:未显式关闭可能导致内存泄漏,建议使用with语句自动管理:
with sqlite3.connect('my_database.db') as conn: cursor = conn.cursor() # 执行操作... # 自动提交并关闭连接
其他语言快速示例
Java (JDBC)
import org.sqlite.JDBC; import java.sql.; public class Main { public static void main(String[] args) throws Exception { Class.forName("org.sqlite.JDBC"); // 注册驱动 Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT FROM users"); while (rs.next()) { System.out.println(rs.getString("name")); } conn.close(); // 关闭连接 } }
依赖配置:需下载sqlite-jdbc JAR包并加入项目类路径。
Node.js (better-sqlite3)
const db = require('better-sqlite3')('mydb.db'); const stmt = db.prepare('SELECT FROM users WHERE id = ?'); const row = stmt.get(1); // 查询ID=1的记录 console.log(row); db.close(); // 关闭数据库连接
性能优势:better-sqlite3采用原生C++绑定,比默认的sqlite3模块快5-10倍。
命令行工具直连
进入SQLite交互终端
sqlite3 my_database.db # 打开现有数据库或新建
️ 常用命令:
- .tables:查看所有表;
- .mode column:按列格式输出;
- .headers on:显示列名;
- .quit:退出终端。
手动执行SQL
-创建表 CREATE TABLE products( pid INTEGER PRIMARY KEY, product_name TEXT, price REAL ); -插入数据 INSERT INTO products (product_name, price) VALUES ('手机', 2999.99), ('平板', 1899.5); -查询结果 SELECT FROM products;
批量操作:可将SQL语句保存为.sql文件,通过sqlite3 db_name < script.sql执行。

常见问题排查指南
Q1: 无法找到数据库文件怎么办?
原因分析:默认在当前工作目录创建,若程序运行目录与预期不符会导致找不到文件;
解决方案:使用绝对路径(如/home/user/data/mydb.db),或通过os.path模块动态拼接路径。
Q2: 并发写入出现锁死怎么办?
原因分析:SQLite默认采用独占式锁,同一时间只允许一个写操作;
解决方案:启用WAL模式(Write-Ahead Logging):
conn = sqlite3.connect('mydb.db', isolation_level=None, uri=True) conn.execute("PRAGMA journal_mode=WAL") # 开启WAL日志模式
适用场景:高并发读多写少的场景(如Web服务器)。
相关问答FAQs
Q: SQLite适合大型生产环境吗?
A: SQLite更适合中小型应用(百万级以下数据量),对于超大规模数据或高并发场景,建议改用MySQL/PostgreSQL等客户端-服务器架构数据库,但可通过以下优化提升性能:① 合理设置缓存大小(PRAGMA cache_size = N);② 使用事务批量提交;③ 定期执行VACUUM整理碎片。
Q: 如何迁移已有SQLite数据库到其他数据库?
A: 推荐两种方案:① 使用中间件转换(如sqlitebrowser导出CSV,再导入目标数据库);② 编写脚本逐条读取SQLite数据并写入新数据库,注意处理数据类型差异(如SQLite的BOOLEAN在其他数据库中需映射为TINYINT(1))。
