• [技术干货] SQLite Delete详解及实例代码
    SQLite Delete详解SQLite 的 DELETE 查询用于删除表中已有的记录。可以使用带有 WHERE 子句的 DELETE 查询来删除选定行,否则所有的记录都会被删除。语法带有 WHERE 子句的 DELETE 查询的基本语法如下:DELETE FROM table_name WHERE [condition];您可以使用 AND 或 OR 运算符来结合 N 个数量的条件。实例假设 COMPANY 表有以下记录:ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0 7 James 24 Houston 10000.0下面是一个实例,它会删除 ID 为 7 的客户:sqlite> DELETE FROM COMPANY WHERE ID = 7;现在,COMPANY 表有以下记录:ID NAME AGE ADDRESS SALARY ---------- ---------- ---------- ---------- ---------- 1 Paul 32 California 20000.0 2 Allen 25 Texas 15000.0 3 Teddy 23 Norway 20000.0 4 Mark 25 Rich-Mond 65000.0 5 David 27 Texas 85000.0 6 Kim 22 South-Hall 45000.0如果您想要从 COMPANY 表中删除所有记录,则不需要使用 WHERE 子句,DELETE 查询如下:sqlite> DELETE FROM COMPANY;现在,COMPANY 表中没有任何的记录,因为所有的记录已经通过 DELETE 语句删除。
  • [技术干货] HTCondor 8.9.2编译过程报“sqlite3.h: No such file or directory”解决方法
    【问题描述】HTCondor 8.9.2编译过程报“fatal error: sqlite3.h: No such file or directory”错误,详细报错如下:【解决方法】查找sqlite3.h文件:find / -name sqlite3.h将上面红框内的sqlite3.h拷贝到src/gce_gahp/路径再次执行make编译即可。
  • [问题求助] sqlite如何在liteos下使用
    大家好,我尝试把sqlite3.5在liteos下使用,总是各种问题,请问有没有移植好的库可以使用呢?
  • [技术干货] 基于Android SQLite的升级详解
    做Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了。SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:ALTER TABLE Subscription ADD COLUMN Activation BLOB;ALTER TABLE Subscription ADD COLUMN Key BLOB;另外,如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。1. 将表名改为临时表ALTER TABLE Subscription RENAME TO __temp__Subscription;2. 创建新表CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);3. 导入数据INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;4. 删除临时表DROP TABLE __temp__Subscription;通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。
  • [技术干货] SQLite表达式详解(分享)
    一、常用表达式:    和大多数关系型数据库一样,SQLite能够很好的支持SQL标准中提供的表达式,其函数也与SQL标准保持一致,如:    ||    *    /    %    +    -    <<   >>   &    |    <    <=   >    >=    =    ==   !=   <>   IS   IS NOT   IN   LIKE     AND       OR    ~    NOT在上面的表达式中,唯一需要说明的是"||",该表达式主要用于两个字符串之间的连接,其返回值为连接后的字符串,即便该操作符两边的操作数为非字符串类型,在执行该表达式之前都需要被提前转换为字符串类型,之后再进行连接。二、条件表达式:    该表达式的语法规则如下:    1). CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END    2). CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 END  对于第一种情况,条件表达式x只需计算一次,然后分别和WHEN关键字后的条件逐一进行比较,直到找到相等的条件,其比较规则等价于等号(=)表达式。如果找到匹配的条件,则返回其后THEN关键字所指向的值,如果没有找到任何匹配,则返回ELSE关键字之后的值,如果不存在ELSE分支,则返回NULL。对于第二种情况,和第一种情况相比,唯一的差别就是表达式x可能被多次执行,比如第一个WHEN条件不匹配,则继续计算后面的WHEN条件,其它规则均与第一种完全相同。最后需要说明的是,以上两种形式的CASE表达式均遵守短路原则,即第一个表达式的条件一旦匹配,其后所有的WHEN表达式均不会再被执行或比较。三、转换表达式:    该表达式的语法规则如下:    CAST(expr AS target_type)该表达式会将参数expr转换为target_type类型,具体的转换规则见如下列表:目标类型转换规则描述TEXT如果转换INTEGER或REAL类型的值到TEXT类型直接转换即可,就像C/C++接口函数sqlite3_snprintf所完成的工作。REAL如果转换TEXT类型的值到REAL类型,在该文本的最前部,将可以转换为实数的文本转换为相应的实数,其余部分忽略。其中该文本值的前导零亦将被全部忽略。如果该文本值没有任何字符可以转换为实数,CAST表达式的转换结果为0.0。INTEGER如果转换TEXT类型的值到INTEGER类型,在该文本的最前部,将可以转换为整数的文本转换为相应的整数,其余部分忽略。其中该文本值的前导零亦将被全部忽略。如果该文本值没有任何字符可以转换为整数,CAST表达式的转换结果为0。如果转换将一个实数值转换为INTEGER类型,则直接截断实数小数部分。如果实数过大,则返回最大的负整数:-9223372036854775808。NUMERIC如果转换文本值到NUMERIC类型,则先将该值强制转换为REAL类型,只有在将REAL转换为INTEGER不会导致数据信息丢失以及完全可逆的情况下,SQLite才会进一步将其转换为INTEGER类型。 最后需要说明的是,如果expr为NULL,则转换的结果也为NULL。
  • [技术干货] SQLite数据库和事务(分享)
    一、Attach数据库:     ATTACH DATABASE语句添加另外一个数据库文件到当前的连接中,如果文件名为":memory:",我们可以将其视为内存数据库,内存数据库无法持久化到磁盘文件上。如果操作Attached数据库中的表,则需要在表名前加数据库名,如dbname.table_name。最后需要说明的是,如果一个事务包含多个Attached数据库操作,那么该事务仍然是原子的。见如下示例:    sqlite> CREATE TABLE testtable (first_col integer);    sqlite> INSERT INTO testtable VALUES(1);    sqlite> .backup 'D:/mydb.db'   --将当前连接中的主数据库备份到指定文件。    sqlite> .exit    --重新登录sqlite命令行工具:    sqlite> CREATE TABLE testtable (first_col integer);    sqlite> INSERT INTO testtable VALUES(2);    sqlite> INSERT INTO testtable VALUES(1);    sqlite> ATTACH DATABASE 'D:/mydb.db' AS mydb;        sqlite> .header on            --查询结果将字段名作为标题输出。    sqlite> .mode column        --将每列都分开显示。    sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col = t2.first_col;    first_col    ----------    1    二、Detach数据库:        卸载将当前连接中的指定数据库,注意main和temp数据库无法被卸载。见如下示例:    --该示例承载上面示例的结果,即mydb数据库已经被Attach到当前的连接中。    sqlite> DETACH DATABASE mydb;    sqlite> SELECT t1.first_col FROM testtable t1, mydb.testtable t2 WHERE t.first_col = t2.first_col;    Error: no such table: mydb.testtable    三、事务:    在SQLite中,如果没有为当前的SQL命令(SELECT除外)显示的指定事务,那么SQLite会自动为该操作添加一个隐式的事务,以保证该操作的原子性和一致性。当然,SQLite也支持显示的事务,其语法与大多数关系型数据库相比基本相同。见如下示例:    sqlite> BEGIN TRANSACTION;    sqlite> INSERT INTO testtable VALUES(1);    sqlite> INSERT INTO testtable VALUES(2);    sqlite> COMMIT TRANSACTION;      --显示事务被提交,数据表中的数据也发生了变化。    sqlite> SELECT COUNT(*) FROM testtable;    COUNT(*)    ----------    2    sqlite> BEGIN TRANSACTION;    sqlite> INSERT INTO testtable VALUES(1);    sqlite> ROLLBACK TRANSACTION;  --显示事务被回滚,数据表中的数据没有发生变化。    sqlite> SELECT COUNT(*) FROM testtable;    COUNT(*)    ----------    2
  • [技术干货] Android批量插入数据到SQLite数据库的方法
    Android中在sqlite插入数据的时候默认一条语句就是一个事务,因此如果存在上万条数据插入的话,那就需要执行上万次插入操作,操作速度可想而知。因此在Android中插入数据时,使用批量插入的方式可以大大提高插入速度。有时需要把一些数据内置到应用中,常用的有以下几种方式:1、使用db.execSQL(sql)这里是把要插入的数据拼接成可执行的sql语句,然后调用db.execSQL(sql)方法执行插入。public void inertOrUpdateDateBatch(List<String> sqls) { SQLiteDatabase db = getWritableDatabase(); db.beginTransaction(); try { for (String sql : sqls) { db.execSQL(sql); } // 设置事务标志为成功,当结束事务时就会提交事务 db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { // 结束事务 db.endTransaction(); db.close(); } } 2、使用db.insert("table_name", null, contentValues)这里是把要插入的数据封装到ContentValues类中,然后调用db.insert()方法执行插入。db.beginTransaction(); // 手动设置开始事务 for (ContentValues v : list) { db.insert("bus_line_station", null, v); } db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交 db.endTransaction(); // 处理完成 db.close() 3、使用InsertHelper类这个类在API 17中已经被废弃了InsertHelper ih = new InsertHelper(db, "bus_line_station"); db.beginTransaction(); final int directColumnIndex = ih.getColumnIndex("direct"); final int lineNameColumnIndex = ih.getColumnIndex("line_name"); final int snoColumnIndex = ih.getColumnIndex("sno"); final int stationNameColumnIndex = ih.getColumnIndex("station_name"); try { for (Station s : busLines) { ih.prepareForInsert(); ih.bind(directColumnIndex, s.direct); ih.bind(lineNameColumnIndex, s.lineName); ih.bind(snoColumnIndex, s.sno); ih.bind(stationNameColumnIndex, s.stationName); ih.execute(); } db.setTransactionSuccessful(); } finally { ih.close(); db.endTransaction(); db.close(); } 4、使用SQLiteStatement查看InsertHelper时,官方文档提示改类已经废弃,请使用SQLiteStatementString sql = "insert into bus_line_station(direct,line_name,sno,station_name) values(?,?,?,?)"; SQLiteStatement stat = db.compileStatement(sql); db.beginTransaction(); for (Station line : busLines) { stat.bindLong(1, line.direct); stat.bindString(2, line.lineName); stat.bindLong(3, line.sno); stat.bindString(4, line.stationName); stat.executeInsert(); } db.setTransactionSuccessful(); db.endTransaction(); db.close(); 第三种方法需要的时间最短,鉴于该类已经在API17中废弃,所以第四种方法应该是最优的方法。
  • [技术干货] 安装和使用 SQLite
    介绍SQLite是一个免费的跨平台数据库管理系统。它因其与许多不同的编程语言接口的效率和能力而广受欢迎。在此教程中,您将在Ubuntu 20.04上安装SQLite。然后,您将创建一个数据库,从其中读取数据,插入项目,删除项目,并从单独的表中加入项目。注意:本教程包括安装和使用 SQLite 的实际说明。它不包括更大的概念问题和生产问题,例如何时应该或不应该考虑使用 SQLite 数据库。有关流行关系数据库及其比较方式的出色概述,请查看我们的文章,SQLite vs MySQL vsPostgresQL:关系数据库管理系统的比较。此外,许多语言与 SQLite 保持集成。有关在 Python 代码中使用 SQLite 的说明,请查看我们的教程,如何在 Python 3 中使用sqlite3模块。先决条件要完成此教程,您需要:运行Ubuntu 20.04的本地机器或服务器。第1步-在乌本图20.04安装SQLite要在 Ubuntu 上安装 SQLite 命令线接口,请首先更新您的包列表:sudo apt update现在安装 SQ 利特:sudo apt install sqlite3要验证安装,请检查软件的版本:sqlite --version您将收到这样的输出:Output3.31.1 2020-01-27 19:55:54 3bfa9cc97da10598521b342961df8f5f68c7388fa117345eeb516eaa837balt1安装 SQLite 后,您现在已准备好创建新数据库。第 2 步 - 创建 SQLite 数据库在此步骤中,您将创建一个包含不同鲨鱼及其属性的数据库。要创建数据库,请打开终端并运行此命令:sqlite3sqlite3 sharks.db这将创建一个新的数据库命名。如果文件已经存在,SQLite 将打开与它的连接:如果它不存在,SQLite将创建它。sharkssharks.db您将收到这样的输出:OutputSQLite version 3.31.1 2020-01-27 19:55:54 Enter ".help" for usage hints.在此之后,您的提示将更改。一个新的前缀,现在出现:sqlite>创建鲨鱼数据库后,您现在将创建一个新表并填充数据。第 3 步 - 创建 SQLite 表SQLite 数据库被组织成表格。表存储信息。为了更好地可视化一张桌子,人们可以想象行和列。本教程的其余部分将遵循进入 SQLite 命令的常见惯例。SQLite 命令是大写字母,用户信息是小写字母。线必须以分号结束。现在,让我们为各种数据创建一个表和一些列:An ID鲨鱼的名字鲨鱼的类型鲨鱼的平均长度(厘米)使用以下命令创建表:CREATE TABLE sharks(id integer NOT NULL, name text NOT NULL, sharktype text NOT NULL, length integer NOT NULL);使用使该字段成为必需的。我们将在下一节中更详细地讨论。NOT NULLNOT NULL创建表后,空提示将返回。现在,让我们插入一些值。将值插入表中在 SQLite 中,将值插入表中的命令遵循此一般形式:INSERT INTO tablename VALUES(values go here);你的桌子的名字在哪里,并进入括号内。tablenamevalues现在将三行插入您的表格:VALUESsharksINSERT INTO sharks VALUES (1, "Sammy", "Greenland Shark", 427);INSERT INTO sharks VALUES (2, "Alyoshka", "Great White Shark", 600);INSERT INTO sharks VALUES (3, "Himari", "Megaladon", 1800);因为您之前为表中的每一个变量指定了每个变量,因此您必须为每个变量输入一个值。NOT NULL例如,尝试添加另一条鲨鱼而不设置其长度:INSERT INTO sharks VALUES (4, "Faiza", "Hammerhead Shark");您将收到此错误:OutputError: table sharks has 4 columns but 3 values were supplied在此步骤中,您创建了一个表并将其插入值。在下一步中,您将从数据库表中阅读。第4步——在SQLite中阅读表格在此步骤中,我们将重点讨论从表中读取数据的最基本方法。认识到 SQLite 提供了更具体的表中查看数据的方法。要查看带有所有插入值的表,请使用:SELECTSELECT * FROM sharks;您将看到以前插入的条目:Output1|Sammy|Greenland Shark|427 2|Alyoshka|Great White Shark|600 3|Himari|Megaladon|1800要根据条目(我们手动设置的值)查看条目,请将命令添加到您的查询中:idWHERESELECT * FROM sharks WHERE id IS 1;这将返回鲨鱼的平等:id1Output1|Sammy|Greenland Shark|427让我们仔细看看这个命令。首先,我们都()从我们的数据库值,。SELECT*sharks然后我们查看所有值。id然后,我们将所有表格条目返回到等于。id1到目前为止,您已经创建了一个表,将数据插入其中,并查询保存的数据。现在,您将更新现有表。第 5 步 - 在 SQLite 中更新表在以下两个部分中,您将首先在现有表中添加一个新列,然后更新表中的现有值。向 SQLite 表添加列SQLite 允许您使用命令更改表。这意味着您可以创建新的行和列,或修改现有的行和列。ALTER TABLE用于创建新列。本新专栏将跟踪每条鲨鱼的年龄:ALTER TABLEALTER TABLE sharks ADD COLUMN age integer;你现在有第五栏了。age在 SQLite 表中更新值使用命令,为每只鲨鱼添加新值:UPDATEageUPDATE sharks SET age = 272 WHERE id=1;UPDATE sharks SET age = 70 WHERE id=2;UPDATE sharks SET age = 40 WHERE id=3;Output1|Sammy|Greenland Shark|427|272 2|Alyoshka|Great White Shark|600|70 3|Himari|Megaladon|1800|40在此步骤中,您更改了表的组成,然后更新了表内的值。在下一步中,您将从表中删除信息。第 6 步 - 删除 SQLite 中的信息在此步骤中,您将根据对参数的评估删除表中的条目。在以下命令中,您正在查询您的数据库,并要求它删除您餐桌上所有年龄小于 200 岁的鲨鱼:sharksDELETE FROM sharks WHERE age <= 200;打字将验证这一点,并且,谁每个不到200岁,被删除。只有格陵兰鲨鱼仍然存在:SELECT * FROM sharks;AlyoshkaHimariSammyOutput1|Sammy|Greenland Shark|427|272第 7 步 - 在 SQLite 中加入信息试想一下,我们有两张桌子:我们目前的桌子和一张桌子。现在,如果表具有映射到表中的 s 的值,并且它具有指示每个鲨鱼保护状态的值,该怎么办?sharksendangeredendangeredididsharksstatus如果您想查询两个表中的数据,您可以使用 SQLite 的四个连接命令之一:INNER JOINOUTER JOINLEFT JOINCROSS JOIN让我们创建第二个表,然后使用加入一些数据。INNER JOIN首先,创建您的表:endangeredCREATE TABLE endangered (id integer NOT NULL, status text NOT NULL);INSERT INTO endangered VALUES (1,  "near threatened");现在加入您的表格:SELECT * FROM sharks INNER JOIN endangered on sharks.id = endangered.id;`您的输出将看起来像这样:Output1|Sammy|Greenland Shark|427|272|1|near threatened请注意,输出还包括来自 。您可以使用更明确的命令指定所需的输出:idendangeredSELECT sharks.id, sharks.name, sharks.sharktype, sharks.length, sharks.age, endangered.status FROM sharks INNER JOIN endangered on sharks.id = endangered.id;此时间输出排除了第二个值:idOutput1|Sammy|Greenland Shark|427|272|near threatened您现在已成功加入来自多个表的信息。结论SQLite 是数据库管理的有用工具。可以快速创建数据库,并使用各种命令操作它。在此教程之后,您现在对 SQLite 有了基本的了解,并准备深入到此数据库管理系统中。此外,许多语言与 SQLite 保持集成。对于 SQLite 语法的具体帮助,官方文档是另一个极好的资源。
  • [技术干货] SQLite内置函数
    一、聚合函数:    SQLite中支持的聚合函数在很多其他的关系型数据库中也同样支持,因此我们这里将只是给出每个聚集函数的简要说明,而不在给出更多的示例了。这里还需要进一步说明的是,对于所有聚合函数而言,distinct关键字可以作为函数参数字段的前置属性,以便在进行计算时忽略到所有重复的字段值,如count(distinct x)。函数说明avg(x)该函数返回在同一组内参数字段的平均值。对于不能转换为数字值的String和BLOB类型的字段值,如'HELLO',SQLite会将其视为0。avg函数的结果总是浮点型,唯一的例外是所有的字段值均为NULL,那样该函数的结果也为NULL。count(x|*)count(x)函数返回在同一组内,x字段中值不等于NULL的行数。count(*)函数返回在同一组内的数据行数。group_concat(x[,y])该函数返回一个字符串,该字符串将会连接所有非NULL的x值。该函数的y参数将作为每个x值之间的分隔符,如果在调用时忽略该参数,在连接时将使用缺省分隔符","。再有就是各个字符串之间的连接顺序是不确定的。max(x)该函数返回同一组内的x字段的最大值,如果该字段的所有值均为NULL,该函数也返回NULL。 min(x)该函数返回同一组内的x字段的最小值,如果该字段的所有值均为NULL,该函数也返回NULL。sum(x)该 函数返回同一组内的x字段值的总和,如果字段值均为NULL,该函数也返回NULL。如果所有的x字段值均为整型或者NULL,该函数返回整型值,否则就 返回浮点型数值。最后需要指出的是,如果所有的数据值均为整型,一旦结果超过上限时将会抛出"integer overflow"的异常。total(x)该函数不属于标准SQL,其功能和sum基本相同,只是计算结果比sum更为合理。比如当所有字段值均为NULL时,和sum不同的是,该函数返回0.0。再有就是该函数始终返回浮点型数值。该函数始终都不会抛出异常。二、核心函数:    以下函数均为SQLite缺省提供的内置函数,其声明和描述见如下列表:函数说明abs(X)该函数返回数值参数X的绝对值,如果X为NULL,则返回NULL,如果X为不能转换成数值的字符串,则返回0,如果X值超出Integer的上限,则抛出"Integer Overflow"的异常。changes()该函数返回最近执行的INSERT、UPDATE和DELETE语句所影响的数据行数。我们也可以通过执行C/C++函数sqlite3_changes()得到相同的结果。coalesce(X,Y,...)返回函数参数中第一个非NULL的参数,如果参数都是NULL,则返回NULL。该函数至少2个参数。ifnull(X,Y)该函数等同于两个参数的coalesce()函数,即返回第一个不为NULL的函数参数,如果两个均为NULL,则返回NULL。length(X) 如果参数X为字符串,则返回字符的数量,如果为数值,则返回该参数的字符串表示形式的长度,如果为NULL,则返回NULL。lower(X)返回函数参数X的小写形式,缺省情况下,该函数只能应用于ASCII字符。ltrim(X[,Y])  如果没有可选参数Y,该函数将移除参数X左侧的所有空格符。如果有参数Y,则移除X左侧的任意在Y中出现的字符。最后返回移除后的字符串。max(X,Y,...)返回函数参数中的最大值,如果有任何一个参数为NULL,则返回NULLmin(X,Y,...)返回函数参数中的最小值,如果有任何一个参数为NULL,则返回NULL。三、日期和时间函数:    SQLite主要支持以下四种与日期和时间相关的函数,如:    1). date(timestring, modifier, modifier, ...)    2). time(timestring, modifier, modifier, ...)    3). datetime(timestring, modifier, modifier, ...)    4). strftime(format, timestring, modifier, modifier, ...)    以上所有四个函数都接受一个时间字符串作为参数,其后再跟有0个或多个修改符。其中strftime()函数还接受一个格式字符串作为其第一个参数。strftime()和C运行时库中的同名函数完全相同。至于其他三个函数,date函数的缺省格式为:"YYYY-MM-DD",time函数的缺省格式为:"HH:MM:SS",datetime函数的缺省格式为:"YYYY-MM-DD HH:MM:SS"。      1. strftime函数的格式信息:格式说明%dday of month: 00%ffractional seconds: SS.SSS%Hhour: 00-24%jday of year: 001-366%JJulian day number%mmonth: 01-12%Mminute: 00-59%sseconds since 1970-01-01%Sseconds: 00-59需要额外指出的是,其余三个时间函数均可用strftime来表示,如:需要额外指出的是,其余三个时间函数均可用strftime来表示,如:     date(...)         strftime('%Y-%m-%d', ...)     time(...)         strftime('%H:%M:%S', ...)     datetime(...)   strftime('%Y-%m-%d %H:%M:%S', ...) 2. 时间字符串的格式:    见如下列表:    1). YYYY-MM-DD    2). YYYY-MM-DD HH:MM    3). YYYY-MM-DD HH:MM:SS    4). YYYY-MM-DD HH:MM:SS.SSS    5). HH:MM    6). HH:MM:SS    7). HH:MM:SS.SSS    8). now    5)到7)中只是包含了时间部分,SQLite将假设日期为2000-01-01。8)表示当前时间。      3. 修改符:    见如下列表:    1). NNN days    2). NNN hours    3). NNN minutes    4). NNN.NNNN seconds    5). NNN months    6). NNN years    7). start of month    8). start of year    9). start of day    10).weekday N        1)到6)将只是简单的加减指定数量的日期或时间值,如果NNN的值为负数,则减,否则加。7)到9)则将时间串中的指定日期部分设置到当前月、年或日的开始。10)则将日期前进到下一个星期N,其中星期日为0。注:修改符的顺序极为重要,SQLite将会按照从左到右的顺序依次执行修改符。       4. 示例:     --返回当前日期。     sqlite> SELECT date('now');       2012-01-15         --返回当前月的最后一天。     sqlite> SELECT date('now','start of month','1 month','-1 day');     2012-01-31     --返回从1970-01-01 00:00:00到当前时间所流经的秒数。     sqlite> SELECT strftime('%s','now');     1326641166         --返回当前年中10月份的第一个星期二是日期。     sqlite> SELECT date('now','start of year','+9 months','weekday 2');     2012-10-02
  • [技术干货] SQLite数据表和视图简介
    一、创建数据表:    该命令的语法规则和使用方式与大多数关系型数据库基本相同,因此我们还是以示例的方式来演示SQLite中创建表的各种规则。但是对于一些SQLite特有的规则,我们会给予额外的说明。注:以下所有示例均是在sqlite自带命令行工具中完成的。    1). 最简单的数据表:    sqlite> CREATE TABLE testtable (first_col integer); 这里需要说明的是,对于自定义数据表表名,如testtable,不能以sqlite_开头,因为以该前缀定义的表名都用于sqlite内部。    2). 创建带有缺省值的数据表:    sqlite> CREATE TABLE testtable (first_col integer DEFAULT 0, second_col varchar DEFAULT 'hello');3). 在指定数据库创建表:    sqlite> ATTACH DATABASE 'd:/mydb.db' AS mydb;     sqlite> CREATE TABLE mydb.testtable (first_col integer);这里先通过ATTACH DATABASE命令将一个已经存在的数据库文件attach到当前的连接中,之后再通过指定数据库名的方式在目标数据库中创建数据表,如mydb.testtable。关于该规则还需要给出一些额外的说明,如果我们在创建数据表时没有指定数据库名,那么将会在当前连接的main数据库中创建该表,在一个连接中只能有一个main数据库。如果需要创建临时表,就无需指定数据库名,见如下示例:    --创建两个表,一个临时表和普通表。    sqlite> CREATE TEMP TABLE temptable(first_col integer);     sqlite> CREATE TABLE testtable (first_col integer);--将当前连接中的缓存数据导出到本地文件,同时退出当前连接。    sqlite> .backup d:/mydb.db     sqlite> .exit重新建立sqlite的连接,并将刚刚导出的数据库作为主库重新导入。    sqlite> .restore d:/mydb.db-查看该数据库中的表信息,通过结果可以看出临时表并没有被持久化到数据库文件中。    sqlite> .tables     testtable4). "IF NOT EXISTS"从句:    如果当前创建的数据表名已经存在,即与已经存在的表名、视图名和索引名冲突,那么本次创建操作将失败并报错。然而如果在创建表时加上"IF NOT EXISTS"从句,那么本次创建操作将不会有任何影响,即不会有错误抛出,除非当前的表名和某一索引名冲突。    sqlite> CREATE TABLE testtable (first_col integer);     Error: table testtable already exists     sqlite> CREATE TABLE IF NOT EXISTS testtable (first_col integer); 5). CREATE TABLE ... AS SELECT:    通过该方式创建的数据表将与SELECT查询返回的结果集具有相同的Schema信息,但是不包含缺省值和主键等约束信息。然而新创建的表将会包含结果集返回的所有数据。    sqlite> CREATE TABLE testtable2 AS SELECT * FROM testtable;         sqlite> .schema testtable2     CREATE TABLE testtable2(first_col INT);6). 主键约束:    --直接在字段的定义上指定主键。     sqlite> CREATE TABLE testtable (first_col integer PRIMARY KEY ASC);     --在所有字段已经定义完毕后,再定义表的数约束,这里定义的是基于first_col和second_col的联合主键。     sqlite> CREATE TABLE testtable2 (        ...>     first_col integer,         ...>     second_col integer,        ...>     PRIMARY KEY (first_col,second_col)        ...> );和其他关系型数据库一样,主键必须是唯一的。    7). 唯一性约束:    --直接在字段的定义上指定唯一性约束。     sqlite> CREATE TABLE testtable (first_col integer UNIQUE);     --在所有字段已经定义完毕后,在定义表的唯一性约束,这里定义的是基于两个列的唯一性约束。     sqlite> CREATE TABLE testtable2 (        ...>     first_col integer,        ...>     second_col integer,        ...>     UNIQUE (first_col,second_col)        ...> );         在SQLite中,NULL值被视为和其他任何值都是不同的,这样包括和其他的NULL值,如下例:     sqlite> DELETE FROM testtable;     sqlite> SELECT count(*) FROM testtable;     count(*)     ----------     0     sqlite> INSERT INTO testtable VALUES(NULL);     sqlite> INSERT INTO testtable VALUES(NULL);     sqlite> SELECT count(*) FROM testtable;     count(*)     ----------     2由此可见,两次插入的NULL值均插入成功。    8). 为空(NOT NULL)约束:    sqlite> CREATE TABLE testtable(first_col integer NOT NULL);     sqlite> INSERT INTO testtable VALUES(NULL);     Error: testtable.first_col may not be NULL9). 检查性约束:    sqlite> CREATE TABLE testtable (first_col integer CHECK (first_col < 5));     sqlite> INSERT INTO testtable VALUES(4);     sqlite> INSERT INTO testtable VALUES(20); -- 20违反了字段first_col的检查性约束(first_col < 5)     Error: constraint failed     --和之前的其它约束一样,检查性约束也是可以基于表中的多个列来定义的。         sqlite> CREATE TABLE testtable2 (        ...>     first_col integer,        ...>     second_col integer,        ...>     CHECK (first_col > 0 AND second_col < 0)        ...> );二、表的修改:    SQLite对ALTER TABLE命令支持的非常有限,仅仅是修改表名和添加新字段。其它的功能,如重命名字段、删除字段和添加删除约束等均为提供支持。    1). 修改表名:    需要先说明的是,SQLite中表名的修改只能在同一个数据库中,不能将其移动到Attached数据库中。再有就是一旦表名被修改后,该表已存在的索引将不会受到影响,然而依赖该表的视图和触发器将不得不重新修改其定义。    sqlite> CREATE TABLE testtable (first_col integer);     sqlite> ALTER TABLE testtable RENAME TO testtable2;     sqlite> .tables     testtable2通过.tables命令的输出可以看出,表testtable已经被修改为testtable2。       2). 新增字段:    sqlite> CREATE TABLE testtable (first_col integer);     sqlite> ALTER TABLE testtable ADD COLUMN second_col integer;     sqlite> .schema testtable     CREATE TABLE "testtable" (first_col integer, second_col integer); 通过.schema命令的输出可以看出,表testtable的定义中已经包含了新增字段。   关于ALTER TABLE最后需要说明的是,在SQLite中该命令的执行时间是不会受到当前表行数的影响,也就是说,修改有一千万行数据的表和修改只有一条数据的表所需的时间几乎是相等的。三、表的删除:   在SQLite中如果某个表被删除了,那么与之相关的索引和触发器也会被随之删除。在很多其他的关系型数据库中是不可以这样的,如果必须要删除相关对象,只能在删除表语句中加入WITH CASCADE从句。见如下示例:    sqlite> CREATE TABLE testtable (first_col integer);     sqlite> DROP TABLE testtable;     sqlite> DROP TABLE testtable;     Error: no such table: testtable     sqlite> DROP TABLE IF EXISTS testtable; 从上面的示例中可以看出,如果删除的表不存在,SQLite将会报错并输出错误信息。如果希望在执行时不抛出异常,我们可以添加IF EXISTS从句,该从句的语义和CREATE TABLE中的完全相同。四、创建视图:    我们这里只是给出简单的SQL命令示例,具体的含义和技术细节可以参照上面的创建数据表部分,如临时视图、"IF NOT EXISTS"从句等。    1). 最简单的视图:    sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;2). 创建临时视图:    sqlite> CREATE TEMP VIEW tempview AS SELECT * FROM testtable WHERE first_col > 100; 3). "IF NOT EXISTS"从句:    sqlite> CREATE VIEW testview AS SELECT * FROM testtable WHERE first_col > 100;     Error: table testview already exists     sqlite> CREATE VIEW IF NOT EXISTS testview AS SELECT * FROM testtable WHERE first_col > 100;五、删除视图:该操作的语法和删除表基本相同,因此这里只是给出示例:     sqlite> DROP VIEW testview;     sqlite> DROP VIEW testview;     Error: no such view: testview     sqlite> DROP VIEW IF EXISTS testview;
  • [技术干货] SQLite数据库介绍
    一、简介:    SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法、事务、数据表和索引等。事实上,尽管SQLite拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。下面我们将列举一下SQLite的主要特征:    1). 管理简单,甚至可以认为无需管理。    2). 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。    3). 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。    4). 易于维护。    综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。SQLite的设计者们为了达到这一目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句等。正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。   二、SQLite的主要优点:    1. 一致性的文件格式:    在SQLite的官方文档中是这样解释的,我们不要将SQLite与Oracle或PostgreSQL去比较,而是应该将它看做fopen和fwrite。与我们自定义格式的数据文件相比,SQLite不仅提供了很好的移植性,如大端小端、32/64位等平台相关问题,而且还提供了数据访问的高效性,如基于某些信息建立索引,从而提高访问或排序该类数据的性能,SQLite提供的事务功能,也是在操作普通文件时无法有效保证的。       2. 在嵌入式或移动设备上的应用:    由于SQLite在运行时占用的资源较少,而且无需任何管理开销,因此对于PDA、智能手机等移动设备来说,SQLite的优势毋庸置疑。       3. 内部数据库:    在有些应用场景中,我们需要为插入到数据库服务器中的数据进行数据过滤或数据清理,以保证最终插入到数据库服务器中的数据有效性。有的时候,数据是否有效,不能通过单一一条记录来进行判断,而是需要和之前一小段时间的历史数据进行特殊的计算,再通过计算的结果判断当前的数据是否合法。在这种应用中,我们可以用SQLite缓冲这部分历史数据。还有一种简单的场景也适用于SQLite,即统计数据的预计算。比如我们正在运行数据实时采集的服务程序,我们可能需要将每10秒的数据汇总后,形成每小时的统计数据,该统计数据可以极大的减少用户查询时的数据量,从而大幅提高前端程序的查询效率。在这种应用中,我们可以将1小时内的采集数据均缓存在SQLite中,在达到整点时,计算缓存数据后清空该数据。       4. 数据分析:    可以充分利用SQLite提供SQL特征,完成简单的数据统计分析的功能。这一点是CSV文件无法比拟的。       5. 产品Demo和测试:    在需要给客户进行Demo时,可以使用SQLite作为我们的后台数据库,和其他关系型数据库相比,使用SQLite减少了大量的系统部署时间。对于产品的功能性测试而言,SQLite也可以起到相同的作用。       三、和RDBMS相比SQLite的一些劣势:    1. C/S应用:    如果你有多个客户端需要同时访问数据库中的数据,特别是他们之间的数据操作是需要通过网络传输来完成的。在这种情况下,不应该选择SQLite。由于SQLite的数据管理机制更多的依赖于OS的文件系统,因此在这种操作下其效率较低。       2. 数据量较大:    受限于操作系统的文件系统,在处理大数据量时,其效率较低。对于超大数据量的存储,甚至不能提供支持。       3. 高并发:    由于SQLite仅仅提供了粒度很粗的数据锁,如读写锁,因此在每次加锁操作中都会有大量的数据被锁住,即使仅有极小部分的数据会被访问。换句话说,我们可以认为SQLite只是提供了表级锁,没有提供行级锁。在这种同步机制下,并发性能很难高效。   四、个性化特征:    1. 零配置:    SQLite本身并不需要任何初始化配置文件,也没有安装和卸载的过程。当然也不存在服务器实例的启动和停止。在使用的过程中,也无需创建用户和划分权限。在系统出现灾难时,如电源问题、主机问题等,对于SQLite而言,不需要做任何操作。       2. 没有独立的服务器:    和其他关系型数据库不同的是,SQLite没有单独的服务器进程,以供客户端程序访问并提供相关的服务。SQLite作为一种嵌入式数据库,其运行环境与主程序位于同一进程空间,因此它们之间的通信完全是进程内通信,而相比于进程间通信,其效率更高。然而需要特别指出的是,该种结构在实际运行时确实存在保护性较差的问题,比如此时,应用程序出现问题导致进程崩溃,由于SQLite与其所依赖的进程位于同一进程空间,那么此时SQLite也将随之退出。但是对于独立的服务器进程,则不会有此问题,它们将在密闭性更好的环境下完成它们的工作。       3. 单一磁盘文件:    SQLite的数据库被存放在文件系统的单一磁盘文件内,只要有权限便可随意访问和拷贝,这样带来的主要好处是便于携带和共享。其他的数据库引擎,基本都会将数据库存放在一个磁盘目录下,然后由该目录下的一组文件构成该数据库的数据文件。尽管我们可以直接访问这些文件,但是我们的程序却无法操作它们,只有数据库实例进程才可以做到。这样的好处是带来了更高的安全性和更好的性能,但是也付出了安装和维护复杂的代价。       4. 平台无关性:    这一点在前面已经解释过了。和SQLite相比,很多数据库引擎在备份数据时不能通过该方式直接备份,只能通过数据库系统提供的各种dump和restore工具,将数据库中的数据先导出到本地文件中,之后在load到目标数据库中。这种方式存在显而易见的效率问题,首先需要导出到另外一个文件,如果数据量较大,导出的过程将会比较耗时。然而这只是该操作的一小部分,因为数据导入往往需要更多的时间。数据在导入时需要很多的验证过程,在存储时,也并非简简单单的顺序存储,而是需要按照一定的数据结构、算法和策略存放在不同的文件位置。因此和直接拷贝数据库文件相比,其性能是非常拙劣的。       5. 弱类型:    和大多数支持静态类型的数据库不同的是,SQLite中的数据类型被视为数值的一个属性。因此对于一个数据表列而言,即便在声明该表时给出了该列的类型,我们在插入数据时仍然可以插入任意类型,比如Integer的列被存入字符串'hello'。针对该特征唯一的例外是整型的主键列,对于此种情况,我们只能在该列中存储整型数据。       6. SQL语句编译成虚拟机代码:    很多数据库产品会将SQL语句解析成复杂的,相互嵌套的数据结构,之后再交予执行器遍历该数据结构完成指定的操作。相比于此,SQLite会将SQL语句先编译成字节码,之后再交由其自带的虚拟机去执行。该方式提供了更好的性能和更出色的调试能力。
  • [调优工具] 【Hyper Tuner调优实践 05】基于系统性能分析工具的sqlite3单插入和多数据插入性能调优
    调优介绍    Hyper Tuner是一款鲲鹏性能调优工具,本实践中使用Tuning Kit工具对sqlite3所在系统执行系统性能全景分析,找到性能瓶颈点,并根据分析结果进行优化修改,从而实现sqlite3多数据插入性能增强。组网环境说明:本实践以TaiShan 200服务器(型号2280)+ Ubuntu18.04.1组网举例,TuningKit在其他鲲鹏平台和操作系统上的操作类似。表格1 sqlite3环境项目说明服务器TaiShan   200 服务器(型号2280)CPUKunpeng     920 4826OSUbuntu 18.04.1应用Sqlite3   python3调优工具Hyper Tuner     2.2.T3 前提条件1.     服务器和操作系统正常运行。2.     PC端已经安装SSH远程登录工具。3.     目标环境上HyperTuner工具已经安装完成,并正常运行。调优思路1.     执行调优之前的代码,用HyperTuner工具对目标环境的空载系统进行全局的系统性能分析。2.     对全景性能分析中,有异常的指标进一步分析,并根据优化建议进行优化修改。3.     对优化后的代码再次进行全景性能分析,验证调优后的效果。操作步骤系统全景分析python3执行附件中的demo.py,此时插入2000000条数据,每次执行的时候就会执行conmmit操作(执行指令 python3 demo.py)数据插入很慢,20秒钟只能插入几百条数据进行全景分析操作性能瓶颈分析在性能全景分析的结果中,查看CPU利用率中的%iowait以及存储IO中的%util,发现CPU等待存储I/O操作导致空闲状态的时间占CPU总时间的百分比 很高,在I/O请求发送到设备期间所消耗的CPU时间百分比也很高,说明程序在执行磁盘操作的时间很长,查看代码,发现是每一条插入语句都得和磁盘交互一次。性能瓶颈优化将代码进行修改,附件中的demo1.py,采用多插入的代码,执行结果如下:,20秒可以执行几十万的数据,插入很快(操作指令:python3 demo1.py)进行全景分析操作调优后结果查看CPU利用率中的%iowait以及存储IO中的%util,发现有明显下降,数据插入也变快了很多。本实践中,通过系统全景分析的采集,一步步找到代码中对于的优化点,主要是cpu等待磁盘操作的时候太长,导致性能较低,通过优化,提高性能总结20秒数据%util%iowaitSqlite单插入400+条数据98.80%52.32%Sqlite多插入(1000条每次)16W+条数据74.00%40.37%
  • [技术干货] SQLite数据库常用语句,MAC上的SQLite可视化工具MeasSQLlite的使用
    一、引言    移动开发的,通常会使用一些小型的数据库进行数据管理,Sqllite 是一款十分小巧的便捷的数据库,在ios中 的开发原生框架也有支持数据库存在的意义就在于其对数据的整合和管理,所以数据库的核心操作无非是对数据进行增,删,改,查得操作。1.建立数据表语句  一个数据库文件中可以由一些表组成,通过下面的语句在数据库文件中创建一张表:create table class(num integer PRIMARY KEY,name text NOT NULL DEFAULT "1班",count integer CHECK(count>10))上面的语句代码可以简化成如下的格式:create table 表名(参数名1 类型 修饰条件,参数名2,类型 修饰参数,···)sqlite中支持如下的类型: smallint 短整型 integer 整型 real 实数型 float 单精度浮点 double 双精度浮点 currency 长整型 varchar 字符型 text 字符串 binary 二进制数据 blob 二进制大对象 boolean 布尔类型 date 日期类型 time 时间类型 timestamp 时间戳类型 关于修饰条件,常用的有如下几种: PRIMARY KEY:将本参数这个为主键,主键的值必须唯一,可以作为数据的索引,例如编号。 NOT NULL :标记本参数为非空属性。 UNIQUE:标记本参数的键值唯一,类似主键。 DEFAULT:设置本参数的默认值 CHECK:参数检查条件,例如上面代码,写入数据是count必须大于时才有效。2.添加数据使用下面的语句来进行数据行的添加操作:insert into class(num,name,count) values(2,"三年2班",58)简化成如下格式:insert into 表名(键1,键2,···) values(值1,值2,···)使用下面的语句进行数据列的添加,即添加一个新的键:alter table class add new text alter table 表名 add 键名 键类型3.修改数据使用如下语句来进行改操作: update class set num=3,name="新的班级" where num=1 update 表名 set 键1=值1,键2=值2 where 条件4.删除数据 delete from class where num=1 delete from 表名 where 条件上面代码删除num为1的一条数据。删除一张表适用下面的语句:drop table class drop table 表名5.查询操作查询操作是数据库的核心功能,sqlite的许多查询命令可以快捷的完成复杂的查询功能。查询表中某些键值: select num from class select 键名,键名··· from 表名查询全部键值数据: select * from class select * from 表名*是一个全通配符,代表不限个数任意字符查询排序: select * from class order by count asc select 键名,键名,··· from 表名 order by 键名 排序方式order by 后面写要进行排序的键名,排序方式有 asc升序 desc降序查找数据条数与查找位置限制: select * from class limit 2 offset 0 select 键名 from 表名 limit 最大条数 offset 查询起始位置条件查询: select * from class where num>2 select 键名 from 表名 where 条件查询数据条数: select count(*) from class select count(键名) from 表名去重查询: select distinct num from class select distinct 键名 from 表名三、MesaSQLite的简单使用方法        MesaSQLite是一款可视化的SQLite数据库编辑软件,使用十分方便1.创建数据库文件打开MesaSQLite软件,在导航栏中选择File,选择弹出菜单中的New DataBase创建一个新的数据库文件,也可以选择Open Database打开一个数据库。注意:默认创建的数据库文件为rdb格式,手动改成db格式即可。2.创建表MesaSQLite有两种方式对数据库进行操作,一种是通过sql语句,一种是通过可视化的界面。在SQL Query工具窗口中,可以通过SQL语句对数据库进行操作,如下图:3.查询操作对于数据的查询操作,同样可以通过SQL Query工具通过语句进行查询或者在Content窗口中填写查询条件进行查询,如下:
  • [技术干货] 一些很有用的SQLite命令总结
    这几天在华为云课堂学习移动开发课程,看到这个SQLite数据库回顾一下:https://developer.huaweicloud.com/activity/full-stack/app-developer.html  附上链接显示表结构:sqlite> .schema [table]获取所有表和视图:sqlite > .tables获取指定表的索引列表:sqlite > .indices [table ]导出数据库到 SQL 文件: sqlite > .output [filename ]  sqlite > .dump  sqlite > .output stdout从 SQL 文件导入数据库:sqlite > .read [filename ]格式化输出数据到 CSV 格式: sqlite >.output [filename.csv ]  sqlite >.separator ,  sqlite > select * from test;  sqlite >.output stdout从 CSV 文件导入数据到表中: sqlite >create table newtable ( id integer primary key, value text );  sqlite >.import [filename.csv ] newtable备份数据库: /* usage: sqlite3 [database] .dump > [filename] */ sqlite3 mytable.db .dump > backup.sql恢复数据库: /* usage: sqlite3 [database ] < [filename ] */  sqlite3 mytable.db < backup.sql
  • [问题求助] npm install 涉及到sqlite3二进制的时候, 会从amazonaws下载, 下载不动. 镜像麻烦添加下sqlite
    npm镜像麻烦添加下sqlite3的二进制node_sqlite3_binary_host_mirror=http://npm.taobao.org/mirrors/node_sqlite3_binary_host_mirror=华为云地址npm install 涉及到sqlite3二进制的时候, 会从amazonaws下载, 被墙了, 下载不动.
总条数:35 到第
上滑加载中