【问题标题】:Parse SQLite ALTER, CREATE & UPDATE解析 SQLite 更改、创建和更新
【发布时间】:2011-01-26 02:48:02
【问题描述】:

我的项目涉及针对 SQLite 数据库运行即席 SQL 语句。我正在寻找一个 JavaScript 正则表达式来解析 ALTER、CREATE 和 UPDATE sql 语句。这是示例和我正在寻找的结果。

创建索引

CREATE INDEX Christy...
CREATE INDEX IF NOT EXISTS Christy...
CREATE UNIQUE INDEX Christy...
CREATE UNIQUE INDEX IF NOT EXISTS Christy...

结果

a = [..."CREATE", "INDEX", "Christy"]

创建没有表约束的表

CREATE TABLE Vicky (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL DEFAULT .10 CHECK (weight<=1));
CREATE TABLE IF NOT EXISTS Vicky (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL DEFAULT .10 CHECK (weight<=1));

结果

a = [..."CREATE", "TABLE", "Vicky", "id INTEGER PRIMARY KEY AUTOINCREMENT","name TEXT","score REAL DEFAULT .10 CHECK (weight<=1)"]

使用表约束创建表

CREATE TABLE Vicky (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL DEFAULT .10 CHECK (weight<=1)),PRIMARY KEY (id, name));
CREATE TABLE IF NOT EXISTS Vicky (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL DEFAULT .10 CHECK (weight<=1)),PRIMARY KEY (id, name));

结果

a = [..."CREATE", "TABLE", "Vicky", "id INTEGER PRIMARY KEY AUTOINCREMENT","name TEXT","score REAL DEFAULT .10 CHECK (weight<=1)","PRIMARY KEY (id, name))"]

创建触发器

CREATE TRIGGER Arwen...
CREATE TRIGGER IF NOT EXISTS Arwen...

结果

a = [..."CREATE", "TRIGGER", "Arwen"]

创建视图

CREATE VIEW Snow...
CREATE VIEW IF NOT EXISTS Snow...

结果

a = [..."CREATE", "VIEW", "Snow"]

更改表

ALTER TABLE Vicky...

结果

a = [..."ALTER", "TABLE", "Vicky"]

更新表格

UPDATE Vicky...
UPDATE OR ROLLBACK Vicky...
UPDATE OR ABORT Vicky...
UPDATE OR REPLACE Vicky...
UPDATE OR FAIL Vicky...
UPDATE OR IGNORE Vicky...

结果

a = [..."UPDATE", "TABLE", "Vicky"] 


下面是这些 SQL 语句的 SQLite 文档的链接。

ALTER TABLE
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
UPDATE

谢谢,
HeadDataZombie

【问题讨论】:

    标签: javascript regex sqlite


    【解决方案1】:

    您是否尝试解析它们以验证准确性?有效性?安全吗?

    解析 SQL 并不容易,我怀疑您是否能够在具有这么多模式的正则表达式中做到这一点。也许this link 可能会有所帮助。另请参阅上一个问题 parsing-sql-create-table-statement-using-jquery 并注意提及 TrimQuery,这可能有助于 JS 实现。

    如果您尝试记录这些修改 (CREATE/ALTER/UPDATE) 语句正在运行的活动,也许只需创建触发器以插入到记录表中就足够了。

    【讨论】:

      【解决方案2】:

      SQL 很难(如果不是不可能的话)用正则表达式解析。不过……

      SQLite 手册每一页顶部的奇怪图表实际上告诉您一切使用解析器生成器(如 PEG.jsJS/CC 解析 SQL 语句时需要知道的) .

      例如,以下 PEG.js 代码将完美解析 ALTER TABLE 语句:

      start = altertable
      
      altertable = "alter" w "table" w ( dbname:identifier w? "." ) ? w? tablename:identifier w ( renameto / addcolumn)
      
      renameto = "rename" w "to" w newname:identifier
      
      addcolumn = "add" w ( "column" w )? col:identifier
      
      identifier = chars:([a-zA-Z][a-zA-Z_0-9]*)
      
      w = " " +
      

      您当然需要添加构建解析树的操作。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      相关资源
      最近更新 更多