澳门新葡亰网址下载开源社区行为准则风波不断,SQLite 遭开发者抵制

by admin on 2020年3月16日

距离 Linux
社区因采用 COC 行为准则而被贡献者威胁要撤销代码的事件不到一个月,关系数据库管理系统 SQLite
昨日也因为其社区行为准则而被许多用户批判和吐槽,甚至表示不会再以任何方式参与该社区。

Linux
社区近日宣布采用 COC 行为准则,该行为准则旨在营造一个开放而热情的环境,为项目和社区的每位参与者创造免受骚扰的体验,无论其年龄、体型、残疾、种族、性别特征、性别认同和性别表达、经验水平、教育、社会经济地位、国籍、外表、种族、宗教,或性认同和性取向。

SQLite
是一款轻量级的、被设计用于嵌入式系统的关联式数据库管理系统。SQLite
是一个实现自我依赖、纯客户端、零配置且支持事务的数据库引擎。它由D.
Richard
Hipp首次开发,目前已是世界上最广泛部署的开源数据库引擎。

澳门新葡亰网址下载 1

此举引发了社区的骚动,多位贡献者和社区成员对 COC
进行批判和反对,甚至有人在邮件列表发起了撤销贡献代码的讨论。

  本文中,我们将介绍如下内容:

SQLite 的行为准则包含 72
条规则,其中包含许多令人啼笑皆非的内容,比如:像爱自己那样爱邻居、不要谋杀、不要通奸、不要偷窃、要拜访病人、要解救穷人、不要裸奔……

澳门新葡亰网址下载 2

创建一个SQLite 数据库

许多人乍一看会认为这是一个奇怪的恶搞文档,但据外媒 The
Register
报道该文档实际已上线 8 个月,而且 SQLite
已经在鼓励用户遵循该行为准则。SQLite 的作者 D.Richard Hipp
表示,文档在正式上线之前有得到贡献者 100% 的支持。在过去的 8
个月里,确实有一些撰稿人称行为准则有点“怪异”,但也仅此而已。直到昨天早上事件出现了“戏剧性”的发酵,他们在推特上受到了大量抨击。

澳门新葡亰网址下载,如果威胁付诸实施,其后果可能包括互联网的大部分内容都会容易受到攻击,世界各地的公司甚至可能会莫名担上一堆不必要的法律责任。

SQLiteConnection conn = new SQLiteConnection("Data Source=mytest.s3db");
conn.Open();

澳门新葡亰网址下载 3

这也引发了另外一场关于 GPLv2
协议的讨论:贡献者能否删除上传的代码?能否再进一步要求使用者也一并删除代码?这些问题在推特上再次引发争论。

SQLite 数据插入

据悉,造成用户不满的主要原因是行为准则中多次提到的宗教立场,像是要尽心尽力爱主、虔诚信奉基督、在基督的爱护下向你的敌人祷告等等。有人认为这种把  COC
和宗教信仰挂钩的行为非常愚蠢且充满歧视,SQLite 分明是在作死。

澳门新葡亰网址下载 4

/// <summary>
///     Allows the programmer to easily insert into the DB
/// </summary>
/// <param name="tableName">The table into which we insert the data.</param>
/// <param name="data">A dictionary containing the column names and data for the insert.</param>
/// <returns>A boolean true or false to signify success or failure.</returns>
public bool Insert(string tableName, Dictionary<string, string> data)
{
    Boolean returnCode = true;
    StringBuilder columnBuilder = new StringBuilder();
    StringBuilder valueBuilder = new StringBuilder();
    foreach (KeyValuePair<string, string> val in data)
    {
        columnBuilder.AppendFormat(" {0},", val.Key);
        valueBuilder.AppendFormat(" '{0}',", val.Value);
    }
    columnBuilder.Remove(columnBuilder.Length - 1, 1);
    valueBuilder.Remove(valueBuilder.Length - 1, 1);
    try
    {
        this.ExecuteNonQuery(string.Format("INSERT INTO {0}({1}) VALUES({2});", 
            tableName, columnBuilder, valueBuilder));
    }
    catch (Exception ex)
    {
        mLog.Warn(ex.ToString());
        returnCode = false;
    }
    return returnCode;
}

for (int i = 0; i <= ROWS4ACTION; i++)
{
    insertParameterDic.Clear();
    DateTime entryTime;
    string name = string.Empty, title = string.Empty;
    GetSampleData(out name, out title, out entryTime);
    int id = random.Next();
    insertParameterDic.Add("Id", id.ToString());
    insertParameterDic.Add("Name", name);
    insertParameterDic.Add("Title", title);
    insertParameterDic.Add("EntryTime",
        entryTime.ToString("yyyy-MM-dd HH:mm:ss"));

    db.Insert("Person", insertParameterDic);
}

D.Richard Hipp 在接受 The
Register 的采访时表示,那些为了管理社区互动而一直呼吁要制定行为准则的用户似乎并不关心
CoC
的内容是什么,只要有写下来这么一个文档就行。对于该文档透露出来的“基督价值观”,他指出
SQLite
的每个源码文件的顶部都有这么一个“祝福”,它并不是许可证,没有要求所有人遵守。

对于事件的后续发展,我们将保持关注。

SQLite 的事务处理方式

对于此事,你怎么看?欢迎评论。

(文/开源中国)    

Begin Transaction:

(文/开源中国)    

澳门新葡亰网址下载 5

Commit Transaction:

澳门新葡亰网址下载 6

Rollback Transaction:

澳门新葡亰网址下载 7

try
{
    db.OpenTransaction();
    Insert4Native();
    db.CommiteTransaction();
}
catch (System.Exception ex)
{
    mLog.Error(ex.ToString());
    db.RollbackTransaction();
}

SQLite 的索引

索引是一种用来优化查询的特性,在数据中分为聚簇索引和非聚簇索引;前者是由数据库中数据组织方式决定的,比如我们在往数据库中一条一条插入数据时,聚簇索引能够保证按顺序插入,插入后数据的位置和结构不变。非聚簇索引是指我们手动、显式创建的索引,可以为数据库中的每个列创建索引,和字典中的索引类似,遵循的原则是对有分散性和组合型的列建立索引,以利于大数据和复杂查询情况下提高查询效率。

澳门新葡亰网址下载 8

/// <summary>
/// Create index
/// </summary>
/// <param name="tableName">table name</param>
/// <param name="columnName">column name</param>
/// <param name="indexName">index name</param>
public void CreateIndex(string tableName, string columnName, string indexName)
{
    string createIndexText = string.Format("CREATE INDEX {0} ON {1} ({2});", 
        indexName, tableName, columnName);
    ExecuteNonQuery(createIndexText);
}

简单查询无关数据库大小情况下对查询效率的测试结果如下(700,000条数据):

string sql = "SELECT LeafName FROM File WHERE Length > 5000";

澳门新葡亰网址下载 9

复杂查询情况下对查询效率的测试结果如下(~40,000条数据):

string sql = "SELECT folder.Location AS FilePath" 
    + "FROM Folder folder LEFT JOIN File file ON file.ParentGuid=folder.Guid" 
    +"WHERE file.Length > 5000000 GROUP BY File.LeafName";

澳门新葡亰网址下载 10

SQLite 的触发器(Trigger)

触发器是指当一个特定的数据库事件(DELETE,
INSERT, or
UPDATE)发生以后自动执行的数据库操作, 
我们可以把触发器理解为高级语言中的事件(Event)。

  假设我有两个表:

Folder(Guid VCHAR(255) NOT NULL, Deleted BOOLEAN DEFAULT 0)

File(ParentGuid VCHAR(255) NOT NULL, Deleted BOOLEAN DEFAULT 0)

在Folder 表中创建一个触发器Update_Folder_Deleted:

CREATE TRIGGER Update_Folder_Deleted UPDATE Deleted ON Folder
  Begin
    UPDATE File SET Deleted=new.Deleted WHERE ParentGuid=old.Guid; 
  END;

创建完触发器以后在执行以下语句:

UPDATE Folder SET Deleted=1 WHERE Guid='13051a74-a09c-4b71-ae6d-42d4b1a4a7ae'

以上语句将会导致下面的语句自动执行:

UPDATE File SET Deleted=1 WHERE ParentGuid='13051a74-a09c-4b71-ae6d-42d4b1a4a7ae'

SQLite 的视图(View)

视图可以是一个虚拟表,里面可以存储按照一定条件过滤出来的数据集合,这样我们再下次想得到这些特定数据集合的时候就不用通过复杂查询来获得,简单的查询指定视图就可以得到想要的数据。

在下个例子中,我们创建一个简单的视图:

澳门新葡亰网址下载 11

基于上面的查询结果我们创建一个视图:

澳门新葡亰网址下载 12

SQLite 命令行工具

SQLite 库中包含了一个SQLite3.exe
的命令行工具,它可以实现SQLite
各项基本操作。这里只介绍一下如何使用它来分析我们的查询结果:

  1. CMD->sqlite3.exe MySQLiteDbWithoutIndex.s3db

澳门新葡亰网址下载 13

  1. 开启EXPLAIN 功能并分析指定查询结果

澳门新葡亰网址下载 14

  1. 重新使用命令行打开一个有索引的数据库并执行前两步

澳门新葡亰网址下载 15

4.
通过比较两个不同查询语句的分析结果,我们可以发现如果查询过程中使用了索引,SQLite
会在detail 列中提示我们。

  1. 要注意的是每条语句后面都要加分号“;”

SQLite一些常见的使用限制

  1. SQLite 不支持Unicode 字符的大小写比较。

  2. 如何处理SQLite 转义字符:

    INSERT INTO xyz VALUES(‘5 O”clock’);

  3. 一条复合SELECT语句的条数限制:

  一条复合查询语句是指多条SELECT语句由 UNION, UNION ALL, EXCEPT, or
INTERSECT 连接起来.
SQLite进程的代码生成器使用递归算法来组合SELECT语句。为了降低堆栈的大小,SQLite
的设计者们限制了一条复合SELECT语句的条目数量。
SQLITE_MAX_COMPOUND_SELECT的默认值是500.
这个值没有严格限制,在实践中,几乎很难看到一条复合查询语句的条目数大于500的。

  这里提到复合查询的原因是我们可以使用它来帮助我们快速插入大量数据:

public void Insert4SelectUnion()
{
    bool newQuery = true;
    StringBuilder query = new StringBuilder(4 * ROWS4ACTION);
    for (int i = 0; i < ROWS4ACTION; i++)
    {
        if (newQuery)
        {
            query.Append("INSERT INTO Person");
            newQuery = false;
        }
        else
        {
            query.Append(" UNION ALL");
        }

        DateTime entryTime;
        string name = string.Empty, title = string.Empty;
        GetSampleData(out name, out title, out entryTime);
        int id = random.Next();
        query.AppendFormat(" SELECT '{0}','{1}','{2}','{3}'", 
            id, name, title, entryTime.ToString("yyyy-MM-dd HH:mm:ss"));
        if (i % 499 == 0)
        {
            db.ExecuteNonQuery(query.ToString());
            query.Remove(0, query.Length);
            newQuery = true;
        }
    }

    //executing remaining lines
    if (!newQuery)
    {
        db.ExecuteNonQuery(query.ToString());
        query.Remove(0, query.Length);
    }
}

参考文档

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图