ci4.6.4连接sqlite必须使用绝对路径,因底层调用php原生new sqlite3($path),仅接受绝对路径;相对路径、database字段误填或目录不存在均导致静默失败。

CI4.6.4 连接 SQLite 必须用绝对路径,且不能填 database 字段——填了反而会覆盖 DSN 解析,导致连接静默失败。
配置 app/Config/Database.php 里的 SQLite 组
CI4 不再用 $db['sqlite'] 多维数组,而是用类属性方式定义连接。你需要在 Database.php 中新增一个连接配置,例如叫 sqlite:
-
DBDriver必须设为'SQLite3'(注意大小写,CI4 原生支持,不用 PDO) -
DSN留空,CI4 会忽略它;hostname、username、password全部不生效,删掉或保持默认值即可 -
database字段必须是**绝对路径**,且指向一个已存在的.db文件(CI4 不会自动创建目录或文件) -
DBDebug建议设为ENVIRONMENT !== 'production',方便查错
示例片段:
public $sqlite = [
'DSN' => '',
'hostname' => '',
'username' => '',
'password' => '',
'database' => '/var/www/myapp/writable/database.db',
'DBDriver' => 'SQLite3',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => '',
];
为什么 database 字段必须是绝对路径?
CI4 的 SQLite3 驱动底层直接调用 PHP 原生 new SQLite3($path),而该构造函数只接受绝对路径。相对路径(如 ./database.db 或 writable/database.db)会触发 Unable to open database: ... 错误,但 CI4 默认不抛出异常,只会返回空结果或静默失败。
- Linux/macOS:用
realpath()或__DIR__ . '/../writable/database.db'拼接更稳妥 - Windows:路径分隔符用正斜杠
/或双反斜杠\都可以,但单反斜杠会引发转义问题 - Web 服务器用户(如
www-data或_www)必须对路径有读写权限,否则连接成功但建表/插入失败
验证连接是否真通了,不是光看 $this->db 有没有对象
CI4 加载连接配置后,$this->db 即使是空数据库也会返回一个有效实例。真正校验要靠一次实际操作:
- 执行
$this->db->query("SELECT 1")->getRowArray(),能拿到['1' => 1]才算通 - 或者建一张测试表:
$this->db->query("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY)"),再查PRAGMA table_info(test) - 如果报错
Unable to connect to the database.或no such table(但你刚建的),大概率是路径权限或路径不存在
Navicat 连接同一 SQLite 文件时也得填绝对路径
这不是 CI4 的限制,而是 SQLite 驱动层的共性。Navicat 对 SQLite 的连接表单里,“Database File”栏必须粘贴完整绝对路径,例如:
- macOS/Linux:
/var/www/myapp/writable/database.db - Windows:
C:/xampp/htdocs/myapp/writable/database.db
“User Name”和“Password”字段不能留空(Navicat 前端校验强制非空),但填任意字符串(如 user 和 pass)即可,它们完全不参与 SQLite 认证。
最常被忽略的一点:路径里的目录必须存在,且 Web 服务进程可写;SQLite 不会帮你 mkdir,也不会告诉你“目录不存在”,只会卡在“连接成功但无表”。











