使用sqlite3执行SQL文件时出现'unclosed ['运行时错误原因排查
问题原因及解决办法
1. 系统Shell的解析冲突
你用sqlite3 nb.db <NB.sql执行时,系统Shell(比如bash)会先扫描SQL文件里的特殊字符,把CHECK约束里的[\s-]当成了文件名匹配的通配符(字符范围语法)。但\s在Shell里不是合法的转义字符,导致Shell无法识别这个方括号范围的结束,直接抛出unclosed '['错误。
2. SQLite命令行默认不支持REGEXP
另外,就算绕开Shell解析问题,标准sqlite3命令行工具默认也没启用REGEXP功能——DB Browser for SQLite是自带了REGEXP扩展的,但原生sqlite3没有,直接执行会报no such function: REGEXP。
解决方法
- 跳过Shell解析,直接让SQLite读文件:用
sqlite3的.read命令执行,这样Shell不会干预文件内容:sqlite3 nb.db ".read NB.sql" - 替换成SQLite原生支持的校验语法:如果不需要REGEXP,用
GLOB(SQLite原生支持的匹配语法)改写规则,比如:CREATE TABLE IF NOT EXISTS "NB" ( "phone" TEXT CHECK("phone" GLOB '^(\+[0-9][0-9])?[ -]?*') ); - 加载REGEXP扩展(可选):如果必须用REGEXP,启动
sqlite3时手动加载对应扩展(不同系统扩展路径不同),比如:sqlite3 nb.db -cmd "LOAD EXTENSION '/usr/lib/sqlite3/pcre.so';" <NB.sql
内容的提问来源于stack exchange,提问作者Nikulok
相关产品推荐
相关产品推荐

