搜索
查看: 616|回复: 3

string.join replace 模式匹配理解,sqlite插入语句拼装

[复制链接]

3

主题

6

帖子

46

积分

新手入门

Rank: 1

积分
46
发表于 2018-6-24 10:11:12 | 显示全部楼层 |阅读模式
假定有如下table
  1. tab = {
  2.         借款人 = "test1";
  3.         借款人婚姻 = "test2";
  4.         借款人实际居住地址 = "test3";
  5.         借款人民族 = "test4";
  6.         借款人电话 = "test";
  7.         借款人职业 = "test";
  8.         借款人身份证号码 = "test";
  9.         借款人身份证地址 = "test";
  10.         借款人配偶 = "test";
  11.         借款人配偶民族 = "test";
  12.         借款人配偶电话 = "test";
  13.         借款人配偶职业 = "test";
  14.         借款人配偶身份证号码 = "test";
  15.         借款人配偶身份证地址 = "test";
  16.         借款利率 = "test";
  17.         借款期限 = "test";
  18.         借款用途 = "test";
  19.         借款金额 = "test";
  20.         担保人1姓名 = "test";
  21.         担保人1婚姻 = "test";
  22.         担保人1实际居住地址 = "test";
  23.         担保人1民族 = "test";
  24.         担保人1电话 = "test";
  25.         担保人1职业 = "test";
  26.         担保人1身份证号码= "test";
  27.         担保人1身份证地址 = "test";
  28.         担保人1配偶 = "test";
  29.         担保人1配偶民族 = "test";
  30.         担保人1配偶电话  = "test";
  31.         担保人1配偶职业  = "test";
  32.         担保人1配偶身份证号码  = "test";
  33.         担保人1配偶身份证地址  = "test";
  34.         担保人2姓名 = "test";
  35.         担保人2婚姻 = "test";
  36.         担保人2实际居住地址 = "test";
  37.         担保人2民族 = "test";
  38.         担保人2电话 = "test";
  39.         担保人2职业 = "test";
  40.         担保人2身份证号码 = "test";
  41.         担保人2身份证地址 = "test";
  42.         担保人2配偶 = "test";
  43.         担保人2配偶民族 = "test";
  44.         担保人2配偶电话  = "test";
  45.         担保人2配偶职业  = "test";
  46.         担保人2配偶身份证号码  = "test";
  47.         担保人2配偶身份证地址  = "test"
  48. }       
复制代码

sqlite创建表tbl,列字段规定用tab的键名,字段不仅包含上面所有tab的健名,而且还有另外10个字段。
要写的sqlite插入语句是  insert into tbl (借款人,借款人婚姻,借款人实际居住地址,借款人民族,...) values ('test1','test2','test3','test4',...)
tbl括号后面的是列名,  values括号后面是前面列名一一对应的数值,需要一一对应。
插入语句 列名如果省略不写 例如 insert into tbl values ('test1','test2','test3','test4',...) 这个时候意思是说:“我不管你有100个列名还是200个,你后面的values也必须是100个或者200个和我一一对应,否则就别添加!”
问题来了,如果我的tab表里面就包含一定的键值对,另外10个字段我不修改,对于字段那么多 该怎么写?
1.  考虑到tab顺序是不确定的,我要取得键值对应的 字符串 用push确保位置固定
        var columns={}
        var values={};
        for name,value in t{
                table.push(columns,name);
                table.push(values,value);
        }

左边是columns,右边是values 是两个字符串数组,并且push确保一一对应,红色框标注的是对应的
2.  先看函数说明 string.join(tab,sep)将一个字符串数组(table对象)以sep指字的分隔标记合并为一个字符串。
        columns = string.join(columns,",");

这个就是sqlite插入指定列用到的(不包含另外10个字段) 我们最后sql语句拼装要用,接下来确定values语句。
3. values的 确定如果还是简单把values字符串数组变成('test1','test2','test3','test4',...),保不定test1带个引号就错误了。
sqlite范例中有个方法拿来用,sqlite.prepare(" insert into tbl (借款人,借款人婚姻,借款人实际居住地址,借款人民族,...) values (@借款人,@借款人婚姻,@借款人实际居住地址,@借款人民族,...)").step(tab)
伪码。。。。意思是prepare 里面的语句还是那句话 一一对应,step里面的tab 表,不用管里面键值对的顺序,会查找键,一一对应前面的@借款人,@借款人婚姻,@借款人实际居住地址,@借款人民族,...
接下来就是要做个

这样的字符串,咋做????????
var v = ..string.replace(columns,"[^\s\p]+","@\1");
函数说明:str = string.replace (str, pattern, repl [, n])
参数分别为(目标字符串,查找模式串,替换字符串,替换次数)。
在模找模式串pattern中可以使用括号分组,在替换串参数repl中可以用\d(d为1到9的数字)引用分组捕获。
一点点理解,"[^\s\p]+"  ^是说 要从开头  \s 是说 空格 \p 是说 是标点符号 ,这三个放在[]里面是说,这三个任意一个都行,+表示后面任意多个

这样匹配到的就是图上的选中的区域,为啥,第一行 ,照应了^要从开头往后面任意多个,后面几行照应了 \p从标点符号往后任意多个。
"@\1"这个咋理解,  \1就是 上图里面选中的全部,@加在上面选中区域的前面 ,如果写成\1@就成了

4.string.format格式化,咋来呢?
        var sql = string.format("insert into basicInfo (%s) values (%s)", columns,v);
        sqlConnection.prepare(sql).step(tab);
也就是sql语句是" insert into tbl (借款人,借款人婚姻,借款人实际居住地址,借款人民族,...) values (@借款人,@借款人婚姻,@借款人实际居住地址,@借款人民族,...)"这个样子。
模式匹配还是好难掌握,其实文章里我还是不太理解,o(* ̄︶ ̄*)o,希望大家都分享一下详细的用法和技巧。


回复

使用道具 举报

51

主题

286

帖子

1720

积分

荣誉会员

Rank: 8Rank: 8

积分
1720
发表于 2018-6-24 11:03:48 | 显示全部楼层
var columns={}
var values={};
for name,value in t{
    table.push(columns,name);
    table.push(values,value);
}
你都写出上面来了,不就已经OK了吗,问得好复杂,自己把自己问晕了吧

..io.open()

var tab = {
    借款人 =
"test1";
    借款人婚姻 =
"test2";
    借款人实际居住地址 =
"test3";
    借款人民族 =
"test4";
    借款人电话 =
"test";
    借款人职业 =
"test";
    借款人身份证号码 =
"test";
    借款人身份证地址 =
"test";
    借款人配偶 =
"test";
    借款人配偶民族 =
"test";
    借款人配偶电话 =
"test";
    借款人配偶职业 =
"test";
    借款人配偶身份证号码 =
"test";
    借款人配偶身份证地址 =
"test";
    借款利率 =
"test";
    借款期限 =
"test";
    借款用途 =
"test";
    借款金额 =
"test";
    担保人1姓名 =
"test";
    担保人1婚姻 =
"test";
    担保人1实际居住地址 =
"test";
    担保人1民族 =
"test";
    担保人1电话 =
"test";
    担保人1职业 =
"test";
    担保人1身份证号码=
"test";
    担保人1身份证地址 =
"test";
    担保人1配偶 =
"test";
    担保人1配偶民族 =
"test";
    担保人1配偶电话  =
"test";
    担保人1配偶职业  =
"test";
    担保人1配偶身份证号码  =
"test";
    担保人1配偶身份证地址  =
"test";
    担保人2姓名 =
"test";
    担保人2婚姻 =
"test";
    担保人2实际居住地址 =
"test";
    担保人2民族 =
"test";
    担保人2电话 =
"test";
    担保人2职业 =
"test";
    担保人2身份证号码 =
"test";
    担保人2身份证地址 =
"test";
    担保人2配偶 =
"test";
    担保人2配偶民族 =
"test";
    担保人2配偶电话  =
"test";
    担保人2配偶职业  =
"test";
    担保人2配偶身份证号码  =
"test";
    担保人2配偶身份证地址  =
"test"
}  

var columns={}
var values={};

for name,value in tab{
    table.push(columns, name);
    table.push(values,
"@"+name);
}

var sql = string.format("insert into basicInfo (%s) values (%s)", string.join(columns,","), string.join(values,","));
..io.print(sql)
sqlConnection.prepare(sql).step(tab);

execute("pause")

◆ 半醒半醉日复日,花落花开年复年 ◆
回复

使用道具 举报

3

主题

6

帖子

46

积分

新手入门

Rank: 1

积分
46
 楼主| 发表于 2018-6-24 11:22:24 | 显示全部楼层
5e365 发表于 2018-6-24 11:03
你都写出上面来了,不就已经OK了吗,问得好复杂,自己把自己问晕了吧
..io.open()

对啊!!!呵呵,我咋没想到!!push的时候直接了事,谢谢指导
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2018-6-24 12:10:43 | 显示全部楼层
有时间写这么长的帖子,直接写SQL最多也就几分钟的事。
要对应排序的字段名2句代码就可以了:
var keys = table.keys(tab);
var values = table.map(keys,lambda(v) '@'+v)
写帖子以前看下文档不行吗?!你自己写的累,别人看的也累。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-19 14:28 , Processed in 0.062500 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表