sqlite.uts 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. import {createSQLiteContext} from '@/uni_modules/uni-sqlContext'
  2. import {selectSqlOptions,executeSqlOptions, executeSqlOptionsResult,selectSqlOptionsResult,transactionResult, ICreateSQLiteContextError } from '@/uni_modules/uni-sqlContext/utssdk/interface.uts'
  3. // 数据库名称
  4. const dbName = 'QT800'
  5. // 数据库地址,推荐以下划线为开头 _doc/xxx.db
  6. // 如果路径不为_downloads/xxx.db,在手机中会找不到文件夹(强烈建议:不要修改路径)
  7. const dbPath = '/www/static/db/qt_app_800'
  8. // 普通函数
  9. // 查询获取数据库里的数据 sql:'SELECT * FROM dbTable WHERE lname = 'lvalue''
  10. // 查询 SELECT * FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值
  11. // @param {Object} dbTable:表名
  12. // @param {Object} lname:列名
  13. // @param {Object} lvalue:列中的属性值
  14. export function selectTableData (
  15. dbTable: string,
  16. lname?: string,
  17. lvalue?: string,
  18. cc?: string,
  19. dd?: string,
  20. ):Promise<UTSJSONObject>
  21. {
  22. if (dbTable !== null) {
  23. // 第一个是表单名称,后两个参数是列表名,用来检索
  24. var sql = '';
  25. if (lname !== null && cc !== null) {
  26. // 两个检索条件
  27. sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}' AND ${cc} = '${dd}'`
  28. }
  29. if (lname !== null && cc == null) {
  30. // 一个检索条件
  31. sql = `SELECT * FROM ${dbTable} WHERE ${lname} = '${lvalue}'`
  32. // console.log(sql);
  33. }
  34. if (lname == null) {
  35. sql = `SELECT * FROM ${dbTable}`
  36. }
  37. const sqlite = createSQLiteContext(dbName);
  38. return new Promise<UTSJSONObject>((resolve, reject) => {
  39. const selectSqlOptions ={
  40. sql: sql,
  41. success: (e: selectSqlOptionsResult) => {
  42. console.log(e)
  43. },
  44. fail: (e: selectSqlOptionsResult) => {
  45. console.error(e)
  46. }
  47. } as selectSqlOptions
  48. const info = sqlite.selectSql(selectSqlOptions) as selectSqlOptionsResult
  49. console.log(info)
  50. const ret = {
  51. errMsg: info?.errMsg ?? '',
  52. data: info?.data ?? ['']
  53. } as UTSJSONObject
  54. resolve(ret)
  55. });
  56. } else {
  57. return new Promise<UTSJSONObject>((resolve, reject) => {
  58. const ret = {
  59. errMsg: '错误查询',
  60. data : ['表名不存在']
  61. } as UTSJSONObject
  62. resolve(ret);
  63. })
  64. }
  65. }
  66. // 普通函数
  67. // 查询获取数据库里的数据 sql:'SELECT a.*,b.name FROM dbTable a LEFTJOIN joinTbName j on a.pid = j.id WHERE lname = 'lvalue''
  68. // 查询 SELECT * FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值
  69. // @param {Object} dbTable:表名
  70. // @param {Object} lname:列名
  71. // @param {Object} lvalue:列中的属性值
  72. export function selectJoinTableData (
  73. dbTable: string,
  74. joinTable: string,
  75. labels: string,
  76. joinCondition: string,
  77. lname?: string,
  78. lvalue?: string,
  79. others?: string
  80. ):Promise<UTSJSONObject>
  81. {
  82. if (dbTable !== null && joinTable !== null && labels !== null && joinCondition !== null ) {
  83. // 第一个是表单名称,后两个参数是列表名,用来检索
  84. var sql = `SELECT ${labels} FROM ${dbTable} LEFT JOIN ${joinTable} ON ${joinCondition} `;
  85. if(lname !== null && lvalue !== null){
  86. sql = sql+ `WHERE ${lname} = '${lvalue}'`;
  87. }
  88. if(others !== null){
  89. sql = sql + others;
  90. }
  91. const sqlite = createSQLiteContext(dbName);
  92. return new Promise<UTSJSONObject>((resolve, reject) => {
  93. const selectSqlOptions ={
  94. sql: sql,
  95. success: (e: selectSqlOptionsResult) => {
  96. console.log(e)
  97. },
  98. fail: (e: selectSqlOptionsResult) => {
  99. console.error(e)
  100. }
  101. } as selectSqlOptions
  102. const info = sqlite.selectSql(selectSqlOptions) as selectSqlOptionsResult
  103. console.log(info)
  104. const ret = {
  105. errMsg: info?.errMsg ?? '',
  106. data: info?.data ?? ['']
  107. } as UTSJSONObject
  108. resolve(ret)
  109. });
  110. } else {
  111. return new Promise<UTSJSONObject>((resolve, reject) => {
  112. const ret = {
  113. errMsg: '错误查询',
  114. data : ['表名不存在']
  115. } as UTSJSONObject
  116. resolve(ret);
  117. })
  118. }
  119. }
  120. // 箭头函数
  121. // 根据条件向表格里添加数据 有数据更新、无数据插入
  122. // (建表时需要设置主键) 例如 --- "roomid" varchar(50) PRIMARY KEY
  123. // @param {Object} dbTable:表名
  124. // @param {Object} data : 插入表中的值结构
  125. // @param {Object} condition : 插入表中对应的列的属性名称结构
  126. export function insertOrReplaceData(dbTable: string, data: string, condition?: string): Promise<UTSJSONObject> {
  127. // 判断有没有传参
  128. if (dbTable !== null && data !== null) {
  129. if (condition == null) {
  130. var sql = `INSERT OR REPLACE INTO ${dbTable} VALUES(${data})`
  131. } else {
  132. var sql = `INSERT OR REPLACE INTO ${dbTable} (${condition}) VALUES(${data})`
  133. }
  134. const sqlite = createSQLiteContext(dbName);
  135. // console.log(sql);
  136. return new Promise((resolve, reject) => {
  137. const executeSqlOptions ={
  138. sql: sql,
  139. success: (e: executeSqlOptionsResult) => {
  140. console.log(e)
  141. },
  142. fail: (e: executeSqlOptionsResult) => {
  143. console.error(e)
  144. }
  145. } as executeSqlOptions
  146. const info = sqlite.executeSql(executeSqlOptions) as executeSqlOptionsResult
  147. console.log(info)
  148. const ret = {
  149. errMsg: info?.errMsg ?? '',
  150. data: info?.data ?? ['']
  151. } as UTSJSONObject
  152. resolve(ret)
  153. })
  154. } else {
  155. return new Promise((resolve, reject) => {
  156. reject('错误添加')
  157. })
  158. }
  159. }
  160. // 普通函数
  161. // 向表格里添加数据 sql:'INSERT INTO dbTable VALUES('x','x','x')' 对应新增
  162. // 或者 sql:'INSERT INTO dbTable ('x','x','x') VALUES('x','x','x')' 具体新增
  163. // 插入 INSERT INTO 、 dbTable 是表名、根据表头列名插入列值
  164. // @param {Object} dbTable:表名
  165. // @param {Object} data : 插入表中的值结构
  166. // @param {Object} condition : 插入表中对应的列的属性名称结构
  167. export function insertTableData(dbTable: string, data: string, condition?: string) : Promise<UTSJSONObject>{
  168. // 判断有没有传参
  169. if (dbTable !== null && data !== null) {
  170. // 判断传的参是否有值
  171. var bol = JSON.stringify(data) == '{}'
  172. if (!bol) {
  173. var sql = ''
  174. if (condition == null) {
  175. sql = `INSERT INTO ${dbTable} VALUES (${data})`
  176. } else {
  177. sql = `INSERT INTO ${dbTable} (${condition}) VALUES(${data})`
  178. }
  179. console.log(sql)
  180. const sqlite = createSQLiteContext(dbName);
  181. return new Promise((resolve, reject) => {
  182. const executeSqlOptions ={
  183. sql: sql,
  184. success: (e: executeSqlOptionsResult) => {
  185. console.log(e)
  186. // 插入成功后,执行查询获取最后插入的ID
  187. const lastIdSql = 'SELECT last_insert_rowid() as lastId';
  188. const selectOptions ={
  189. sql: lastIdSql,
  190. success: (idResult: selectSqlOptionsResult) => {
  191. console.log('获取最后插入ID:', idResult);
  192. },
  193. fail: (idError: selectSqlOptionsResult) => {
  194. console.error('获取最后插入ID失败:', idError);
  195. }
  196. } as selectSqlOptions;
  197. sqlite.selectSql(selectOptions);
  198. },
  199. fail: (e: executeSqlOptionsResult) => {
  200. console.error(e)
  201. }
  202. } as executeSqlOptions
  203. // 先执行插入操作
  204. const info = sqlite.executeSql(executeSqlOptions) as executeSqlOptionsResult;
  205. // 再执行获取最后插入ID的查询
  206. const lastIdSql = 'SELECT last_insert_rowid() as lastId';
  207. const lastIdOptions ={
  208. sql: lastIdSql
  209. } as selectSqlOptions;
  210. const lastIdResult = sqlite.selectSql(lastIdOptions) as selectSqlOptionsResult;
  211. // 提取最后插入的ID
  212. const lastId = lastIdResult?.data != null && lastIdResult.data.length > 0 ? lastIdResult.data[0]['lastId'] : null;
  213. console.log('最后插入的ID:', lastId);
  214. const ret = {
  215. errMsg: info?.errMsg ?? '',
  216. data: info?.data ?? [''],
  217. lastId: lastId // 返回最后插入的ID
  218. } as UTSJSONObject;
  219. sqlite.close();
  220. resolve(ret);
  221. })
  222. } else {
  223. return new Promise((resolve, reject) => {
  224. reject('错误添加')
  225. })
  226. }
  227. } else {
  228. return new Promise((resolve, reject) => {
  229. reject('错误添加')
  230. })
  231. }
  232. }
  233. // 普通函数
  234. // 修改数据表里的数据 sql:"UPDATE dbTable SET 列名 = '列值',列名 = '列值' WHERE lname = 'lvalue'"
  235. // 修改 UPDATE 、 dbTable 是表名, data: 要修改的列名=修改后列值, lname,lvalue 是查询条件的列名和列值
  236. // @param {Object} dbTable:表名
  237. // @param {Object} data : 修改表中的值结构
  238. // @param {Object} lname:列名
  239. // @param {Object} lvalue:列中的属性值
  240. export function updateTableData(dbTable: string, data: string, lname?: string, lvalue?: string) : Promise<UTSJSONObject> {
  241. var sql = ''
  242. if (lname == null) {
  243. sql = `UPDATE ${dbTable} SET ${data}`
  244. } else {
  245. sql = `UPDATE ${dbTable} SET ${data} WHERE ${lname} = '${lvalue}'`
  246. }
  247. const sqlite = createSQLiteContext(dbName);
  248. // WHERE 前面是要修改的列名、列值,后面是条件的列名、列值
  249. return new Promise((resolve, reject) => {
  250. const executeSqlOptions ={
  251. sql: sql,
  252. success: (e: executeSqlOptionsResult) => {
  253. console.log(e)
  254. },
  255. fail: (e: executeSqlOptionsResult) => {
  256. console.error(e)
  257. }
  258. } as executeSqlOptions
  259. const info = sqlite.executeSql(executeSqlOptions) as executeSqlOptionsResult
  260. console.log(info)
  261. const ret = {
  262. errMsg: info?.errMsg ?? '',
  263. data: info?.data ?? ['']
  264. } as UTSJSONObject
  265. sqlite.close();
  266. resolve(ret)
  267. })
  268. }
  269. // 箭头函数
  270. // 获取指定数据条数 sql:"SELECT * FROM dbTable ORDER BY 'id' DESC LIMIT 15 OFFSET 'num'"
  271. // dbTable 表名, ORDER BY 代表排序默认正序, id 是排序的条件 DESC 代表倒序,从最后一条数据开始拿
  272. // LIMIT 15 OFFSET '${num}',这句的意思是跳过 num 条拿 15 条数据, num 为跳过多少条数据是动态值
  273. // 例 初始num设为0,就从最后的数据开始拿15条,下次不拿刚获取的数据,所以可以让num为15,这样就能一步一步的拿完所有的数据
  274. // @param {Object} dbTable:表名
  275. // @param {Object} id:数据id
  276. /**
  277. * @param {Object} num 例子如下:
  278. * select * from boot limit 10 offset 0;
  279. * select * from boot limit 10 offset 10;
  280. * select * from boot limit 10 offset 20;
  281. * select * from boot limit 10 offset 30;
  282. * 比如说每页数量为 10 条,然后我们分别获区第1、2、3、4页的数据
  283. *
  284. */
  285. export function pullSQL(dbTable: string, id: string, num: number) : Promise<UTSJSONObject> {
  286. var sql = `SELECT * FROM ${dbTable} ORDER BY '${id}' DESC LIMIT 15 OFFSET '${num}'`
  287. const sqlite = createSQLiteContext(dbName);
  288. return new Promise((resolve, reject) => {
  289. const selectSqlOptions ={
  290. sql: sql,
  291. success: (e: selectSqlOptionsResult) => {
  292. console.log(e)
  293. },
  294. fail: (e: selectSqlOptionsResult) => {
  295. console.error(e)
  296. }
  297. } as selectSqlOptions
  298. const info = sqlite.selectSql(selectSqlOptions) as selectSqlOptionsResult
  299. console.log(info)
  300. const ret = {
  301. errMsg: info?.errMsg ?? '',
  302. data: info?.data ?? ['']
  303. } as UTSJSONObject
  304. resolve(ret)
  305. })
  306. }
  307. // 获取统计值
  308. // @param {Object} lvalue:关联主表id
  309. export function selectRecordData(
  310. dbTable: string,
  311. lvalue ?: string
  312. ) : Promise<UTSJSONObject> {
  313. var sql = '';
  314. if (lvalue !== null && dbTable !== null) {
  315. sql = `SELECT
  316. pid,
  317. photoitem,
  318. step,
  319. total,
  320. CASE
  321. WHEN has_exception > 0 THEN
  322. 4
  323. WHEN step = 0 THEN
  324. 1
  325. WHEN step < total THEN
  326. 2
  327. WHEN step = total THEN
  328. 3
  329. END AS status
  330. FROM
  331. (
  332. SELECT
  333. pid,
  334. sxid,
  335. photoitem,
  336. SUM( CASE WHEN status IN (3, 4) THEN 1 ELSE 0 END ) AS step,
  337. COUNT( 1 ) AS total,
  338. SUM( CASE WHEN status = 4 THEN 1 ELSE 0 END ) AS has_exception
  339. FROM
  340. ${dbTable}
  341. WHERE
  342. pid = '${lvalue}'
  343. GROUP BY
  344. photoitem
  345. ORDER BY
  346. CAST ( sxid AS INTEGER )
  347. ) AS sub`
  348. const sqlite = createSQLiteContext(dbName);
  349. return new Promise<UTSJSONObject>((resolve, reject) => {
  350. const selectSqlOptions = {
  351. sql: sql,
  352. success: (e : selectSqlOptionsResult) => {
  353. console.log(e)
  354. },
  355. fail: (e : selectSqlOptionsResult) => {
  356. console.error(e)
  357. }
  358. } as selectSqlOptions
  359. const info = sqlite.selectSql(selectSqlOptions) as selectSqlOptionsResult
  360. console.log(info)
  361. const ret = {
  362. errMsg: info?.errMsg ?? '',
  363. data: info?.data ?? ['']
  364. } as UTSJSONObject
  365. resolve(ret)
  366. });
  367. } else {
  368. return new Promise<UTSJSONObject>((resolve, reject) => {
  369. const ret = {
  370. errMsg: '错误查询',
  371. data: ['参数不存在']
  372. } as UTSJSONObject
  373. resolve(ret);
  374. })
  375. }
  376. }
  377. export function selectRecordInfo() : Promise<UTSJSONObject> {
  378. var sql = `SELECT
  379. m.*,
  380. COUNT(r_stats.photoitem) AS totalRecord,
  381. SUM(r_stats.is_status_3_4) AS statusRecordCount,
  382. SUM(r_stats.is_status_4) AS status4RecordCount
  383. FROM
  384. app_media_info m
  385. LEFT JOIN (
  386. SELECT
  387. r.pid,
  388. r.photoitem,
  389. MAX(CASE WHEN r.status IN (3,4) THEN 1 ELSE 0 END) AS is_status_3_4,
  390. MAX(CASE WHEN r.status = 4 THEN 1 ELSE 0 END) AS is_status_4
  391. FROM
  392. app_media_record r
  393. GROUP BY
  394. r.pid, r.photoitem
  395. ) AS r_stats ON m.pdid = r_stats.pid
  396. GROUP BY
  397. m.pdid
  398. ORDER BY
  399. m.pdid DESC`;
  400. const sqlite = createSQLiteContext(dbName);
  401. return new Promise<UTSJSONObject>((resolve, reject) => {
  402. const selectSqlOptions = {
  403. sql: sql,
  404. success: (e : selectSqlOptionsResult) => {
  405. console.log(e)
  406. },
  407. fail: (e : selectSqlOptionsResult) => {
  408. console.error(e)
  409. }
  410. } as selectSqlOptions
  411. const info = sqlite.selectSql(selectSqlOptions) as selectSqlOptionsResult
  412. console.log(info)
  413. const ret = {
  414. errMsg: info?.errMsg ?? '',
  415. data: info?.data ?? ['']
  416. } as UTSJSONObject
  417. resolve(ret)
  418. });
  419. }
  420. // 普通函数
  421. // 查询获取数据库里的最新的一条数据 sql:'SELECT * FROM dbTable WHERE lname = 'lvalue' ORDER BY pdid desc LIMIT 1'
  422. // 查询 SELECT * FROM 、 dbTable 是表名、 WHERE 查找条件 lname,lvalue 是查询条件的列名和列值
  423. // @param {Object} dbTable:表名
  424. // @param {Object} lname:列名
  425. // @param {Object} lvalue:列中的属性值
  426. export function selectLatestInfoData (
  427. productNo?: string,
  428. ):Promise<UTSJSONObject>
  429. {
  430. var sql = `SELECT
  431. m.*,
  432. COUNT(r_stats.photoitem) AS totalRecord,
  433. SUM(r_stats.is_status_3_4) AS statusRecordCount,
  434. SUM(r_stats.is_status_4) AS status4RecordCount
  435. FROM
  436. app_media_info m
  437. LEFT JOIN (
  438. SELECT
  439. r.pid,
  440. r.photoitem,
  441. MAX(CASE WHEN r.status IN (3,4) THEN 1 ELSE 0 END) AS is_status_3_4,
  442. MAX(CASE WHEN r.status = 4 THEN 1 ELSE 0 END) AS is_status_4
  443. FROM
  444. app_media_record r
  445. where productno = '${productNo}'
  446. GROUP BY
  447. r.pid, r.photoitem
  448. ) AS r_stats ON m.pdid = r_stats.pid
  449. where productno = '${productNo}'
  450. GROUP BY
  451. m.pdid
  452. ORDER BY
  453. m.pdid DESC
  454. LIMIT 1`;
  455. const sqlite = createSQLiteContext(dbName);
  456. return new Promise<UTSJSONObject>((resolve, reject) => {
  457. const selectSqlOptions ={
  458. sql: sql,
  459. success: (e: selectSqlOptionsResult) => {
  460. console.log(e)
  461. },
  462. fail: (e: selectSqlOptionsResult) => {
  463. console.error(e)
  464. }
  465. } as selectSqlOptions
  466. const info = sqlite.selectSql(selectSqlOptions) as selectSqlOptionsResult
  467. const ret = {
  468. errMsg: info?.errMsg ?? '',
  469. data: info?.data[0] ?? ''
  470. } as UTSJSONObject
  471. resolve(ret)
  472. });
  473. }
  474. export function deleteTableData(
  475. dbTable: string,
  476. field : string,
  477. value : string
  478. ) : Promise<UTSJSONObject> {
  479. var sql = '';
  480. if (field !== null && dbTable !== null) {
  481. sql = `delete from ${dbTable} where ${field} = '${value}'`
  482. console.log(sql);
  483. const sqlite = createSQLiteContext(dbName);
  484. // WHERE 前面是要修改的列名、列值,后面是条件的列名、列值
  485. return new Promise((resolve, reject) => {
  486. const executeSqlOptions ={
  487. sql: sql,
  488. success: (e: executeSqlOptionsResult) => {
  489. console.log(e)
  490. },
  491. fail: (e: executeSqlOptionsResult) => {
  492. console.error(e)
  493. }
  494. } as executeSqlOptions
  495. const info = sqlite.executeSql(executeSqlOptions) as executeSqlOptionsResult
  496. console.log(info)
  497. const ret = {
  498. errMsg: info?.errMsg ?? '',
  499. data: info?.data ?? ['']
  500. } as UTSJSONObject
  501. sqlite.close();
  502. resolve(ret)
  503. })
  504. } else {
  505. return new Promise<UTSJSONObject>((resolve, reject) => {
  506. const ret = {
  507. errMsg: '错误查询',
  508. data: ['参数不存在']
  509. } as UTSJSONObject
  510. resolve(ret);
  511. })
  512. }
  513. }