久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    SQLite數據庫使用筆記與文檔翻譯草稿

     職業(yè)醬油仔 2013-05-30

    SQLite數據庫使用筆記與文檔翻譯草稿

    分類: C/C++ 45人閱讀 評論(0) 收藏 舉報

    SQLite

     

    SQLite是一個SQL數據庫引擎,該引擎具有自包含,無服務器,零配置,事務性等特征。SQLite是目前被部署最廣泛的一個SQL數據庫引擎,并且其是開源的項目。

          

           開始使用

           首先要下載對應的預編譯庫,或者下載源碼自己進行編譯。

          

           創(chuàng)建新的數據庫

           在shell 或 dos 命令行中,輸入:”sqlite3 test.db”,這條命令將創(chuàng)建一個新的數據庫,名字為”test.db”。

           在命令行行輸入SQL命令,創(chuàng)建和使用新的這個數據庫。

           注:對已有的數據庫輸入該命令表示進入數據庫操作命令行,即可對這個已有的數據庫進行操作,否則建立新的數據庫。

     

           SQLite命令

           在SQLite中包含了一個簡單的命令行工具,sqlite3.exe,通過它用戶可以手動輸入SQL命令來操作SQLite數據庫。如下提供了對sqlite3編程的簡單介紹。

           開始

           啟動sqlite3,直接輸入sqlite3 緊跟著SQLite的數據庫名字。如果數據庫不存在,則自動創(chuàng)建一個新的數據庫。SQLite3程序會提示輸入SQL語句。輸入SQL語句,要以分號結尾,按Enter鍵,則執(zhí)行SQL語句。

           例如創(chuàng)建一個ex1數據庫,并且創(chuàng)建tbl1表如下:

        > sqlite3 ex1
           SQLite version 3.6.11
           Enter ".help" for instructions
           Enter SQL statements terminated with a ";"
           創(chuàng)建或打開數據庫成功,進入SQLite命令行。
            
           創(chuàng)建數據表
           sqlite> create table tbl1(one varchar(10), two smallint);
     
           插入數據:
           sqlite> insert into tbl1 values('hello!',10);
           sqlite> insert into tbl1 values('goodbye', 20);
            
           查詢所有數據
           sqlite> select * from tbl1;
           hello!|10
           goodbye|20
           sqlite>

                 

           可以使用文件結束符,通常是Ctrl-D,來終止sqlite3程序。使用中斷字符,通常是Ctrl-C來停止一個正在運行的SQL語句。

           確保在SQL語句結束時輸入一個分號,SQLite3以分號作為確認SQL命令輸入完成的標識。如果沒有分號,直接回車,則SQLite3會給出提示符,提示繼續(xù)輸入命令。這樣可以將一個SQL語句擴展到多行中。

           
    	sqlite> CREATE TABLE tbl2 (
    	   ...>   f1 varchar(30) primary key,
    	   ...>   f2 text,
    	   ...>   f3 real
    	   ...> );
    	sqlite>

     

           查詢SQLITE_MASTER表

           SQLite數據庫的數據庫模式是存在一個特殊表中的,叫做”sqlite_master”,可以執(zhí)行Select語句,查詢該表中的內容。

    	sqlite> select * from sqlite_master;
    	    type = table
    	    name = tbl1
    	tbl_name = tbl1
    	rootpage = 3
    	        sql = create table tbl1(one varchar(10), two smallint)
    	sqlite>

          

           不能對sqlite_master表做Drop table,update,insert,或delete操作。Sqlite_master表是在創(chuàng)建或刪除表的時候自動更新的。不能對該表做手工的修改。

           Sqlite3的特殊命令

           很多時候,sqlite3僅僅讀入或輸入幾行到SQLite庫來執(zhí)行,但是如果一個命令以點開始”.”,那么這一行被截取,將由sqlite3程序自己進行解釋。這些點命令用于改變查 詢的輸出格式,或者執(zhí)行特定的預先打包的查詢語句。

           可用的特殊命令可以通過.help進行查詢:

           sqlite>.help

    .backup ?DB?FILE      將數據庫DB (默認是"main") 備份到文件FILE

    .bailON|OFF           在遇到錯誤時停止,默認是OFF

    .databases             列舉出附加的數據庫的名字和文件。

    .dump ?TABLE?...      將數據庫表轉換為一個SQL文本的格式

    .echoON|OFF          關閉命令行的echo輸出

    .exit                  退出SQLite3程序

    .explainON|OFF        輸出模式符合純文本是否開啟。

    .genfkey?OPTIONS?    選項如下:

                             --no-drop: 不要燒出老的fkey觸發(fā)器

                             --ignore-errors: 忽略表的fkey錯誤

                             --exec: 立即執(zhí)行生成的SQL

                             參考源文件中的tool/genfkey.README                          

    .header(s)ON|OFF      顯示頭關閉或開啟

    .help                 顯示本條信息

    .import FILETABLE    從FILE導入數據到TABLE表中

    .indicesTABLE        顯示表TABLE所有的目錄名字

    .iotraceFILE          將IO診斷日志寫入FILE中

    .load FILE?ENTRY?    加載一個擴展庫

    .mode MODE?TABLE?  設置輸出模式,MODE如下:

                             csv      逗號分隔值的形式

                             column   左對齊的 (See .width)

                             html     HTML <table>代碼形式

                             insert    SQL插入表TABLE的語句的形式

                             line     每行一個值

                             list      值有分隔符字符串分割

                             tabs     Tab符分割值的形式

                             tcl      TCL列表元素的模式

    .nullvalueSTRING      在NULL位置打印STRING

    .outputFILENAME      將輸出值寫入FILENAME文件中

    .outputstdout          將輸出寫到屏幕

    .prompt MAINCONTINUE  替換標準的提示符

    .quit                  退出本程序

    .readFILENAME       執(zhí)行文件FILENAME的SQL語句

    .restore ?DB?FILE      重存來自FILE文件中DB(default"main")的內容

    .schema?TABLE?       顯示TABLE的創(chuàng)建語句

    .separatorSTRING      修改output模式和.import中的分隔符

    .show                 顯示當前各種設置的值。

    .tables?PATTERN?      列舉符合LIKE模式的表名字。

    .timeout MS            嘗試打開被鎖表的超時時間設置

    .timer ON|OFF          開啟或關閉CPU定時器測量

    .width NUM NUM...     為column模式設置列寬

          

           修改輸出模式:   

           SQLite3可以以八種不同的格式顯示查詢的結果:csv等,可以使用.mode命令在這八種模式之間進行轉換。

           默認的模式是list模式。

    sqlite> .mode list

    sqlite> select * from tbl1;

    hello|10

    goodbye|20

    sqlite>

          

           將分隔符設置為逗號加一個空格的模式:

           sqlite>.separator ", "

    sqlite>select * from tbl1;

    hello, 10

    goodbye, 20

    sqlite>

          

           line模式中,一行中的每一列都是在一個單獨行顯示。每一行由列名,等號以及列數據組成。連續(xù)數據由空行分割。

           sqlite>.mode line

    sqlite>select * from tbl1;

    one = hello

    two = 10

     

    one = goodbye

    two = 20

    sqlite>

          

           在列模式中,每一記錄都是以一行進行顯示,例如:

           sqlite>.mode column

    sqlite>select * from tbl1;

    one         two      

    ----------  ----------

    hello       10       

    goodbye     20       

    sqlite>

           默認情況下每一列是10個字符寬,可以使用”.width”調整列寬來適應內容。例如:

           sqlite>.width 12 6

    sqlite>select * from tbl1;

    one           two  

    ------------  ------

    hello         10   

    goodbye       20   

    sqlite>

          

           將結果寫入一個文件:

           默認的情況下,sqlite3將查詢結果寫入標準輸出,也就是屏幕上,可以使用.output命令將查詢結果輸出到文件。

          

           sqlite>.mode list

    sqlite>.separator |

    sqlite>.output test_file_1.txt

    sqlite>select * from tbl1;

    sqlite> .exit

    $ cattest_file_1.txt

    hello|10

    goodbye|20

    $

           插敘數據庫的模式:

           有幾個方便的命令可以查詢數據庫的模式。

           例如列舉數據庫中的表的名字,可以輸入”.tables”

           sqlite>.tables

    tbl1

    tbl2

    sqlite>

           此命令相當于執(zhí)行了一個對sqlite_master表的聯合查詢

           SELECTname FROM sqlite_master

    WHERE type IN('table','view') AND name NOT LIKE 'sqlite_%'

    UNION ALL

    SELECT name FROMsqlite_temp_master

    WHERE type IN('table','view')

    ORDER BY 1

          

           .schema命令,如果不帶有參數,該命令輸出原始的Create Table或Create Index語句,如果以數據表作為參數,則給出創(chuàng)建該數據表的原始語句。

           sqlite>.schema

    create tabletbl1(one varchar(10), two smallint)

    CREATE TABLEtbl2 (

      f1 varchar(30) primary key,

      f2 text,

      f3 real

    )

    sqlite>.schema tbl2

    CREATE TABLEtbl2 (

      f1 varchar(30) primary key,

      f2 text,

      f3 real

    )

    sqlite>

          

           剩余命令詳見原文檔。

          

           使用SQLite寫程序

           如下是一個簡單的TCL程序,說明了如何使用SQLite的TCL接口。這個程序在第一個參數給定的數據庫中執(zhí)行第二個參數給定的給的SQL語句。要查看該命令則由第七行的sqlite3命令給出,本命令打開SQLite數據庫,創(chuàng)建愛你一個新的TCL命令“db”去訪問數據庫。第八行的命令訪問數據庫,最后一行則是關閉數據庫。

          

           01  #!/usr/bin/tclsh

    02  if {$argc!=2} {

    03    puts stderr "Usage: %s DATABASESQL-STATEMENT"

    04    exit 1

    05  }

    06  load /usr/lib/tclsqlite3.so Sqlite3

    07  sqlite3 db [lindex $argv 0]

    08  db eval [lindex $argv 1] x {

    09    foreach v $x(*) {

    10      puts "$v = $x($v)"

    11    }

    12    puts ""

    13  }

    14  db close

     

           如下是一個簡單的C程序表示如何使用SQLite的C/C++接口。數據庫的名字由第一個參數給出,第二個參數是一個或更多條的SQl語句。需要注意的函數調用是22行的sqlite3_open(),它用于打開數據庫,28行的sqlite3_exec()語句用以執(zhí)行SQL語句,以及33行的sqlite3_close()語句用于關閉數據庫連接。

           參考Introduction To The SQLite C/C++Interface中的介紹概述,以及SQLite的十幾個接口函數。

           01  #include <stdio.h>

    02  #include <sqlite3.h>

    03 

    04  static int callback(void *NotUsed, int argc,char **argv, char **azColName){

    05    int i;

    06    for(i=0; i<argc; i++){

    07      printf("%s = %s\n",azColName[i], argv[i] ? argv[i] : "NULL");

    08    }

    09    printf("\n");

    10    return 0;

    11  }

    12 

    13  int main(int argc, char **argv){

    14    sqlite3 *db;

    15    char *zErrMsg = 0;

    16    int rc;

    17 

    18    if( argc!=3 ){

    19      fprintf(stderr, "Usage: %s DATABASESQL-STATEMENT\n", argv[0]);

    20      return(1);

    21    }

    22    rc = sqlite3_open(argv[1], &db);

    23    if( rc ){

    24      fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));

    25      sqlite3_close(db);

    26      return(1);

    27    }

    28    rc = sqlite3_exec(db, argv[2], callback, 0,&zErrMsg);

    29    if( rc!=SQLITE_OK ){

    30      fprintf(stderr, "SQL error:%s\n", zErrMsg);

    31      sqlite3_free(zErrMsg);

    32    }

    33    sqlite3_close(db);

    34    return 0;

    35  }

     

           SQLite理解的SQL語句

           SQLite可以理解大多數標準的SQL語句,但是它也省略了一些特征,并且加入了一些自己的特征。如下的教程明確地描述了SQLite所支持和不支持的SQL語言。下面提供了一個SQL關鍵字列表。

           具體的SQL語句省略,參見英文的教程中“SQL As Understood By SQLite”一節(jié)

     

           SQLite的C語言接口

          

           如下的頁面描述了SQLite的C語言接口。下面不是一個教程,這些頁面中詳細描述了接口,不太容易閱讀。詳細的可以參考。SQLite In 3 Minutes Or Less,或 Introduction To SQLite C/C++ Interface。

           因此下面我們也僅對這兩個教程進行說明,需要參考完整的SQLite的C語言接口的可以參考SQLite的幫助文檔中的接口文檔。

          

     

    如下是:AnIntroduction To The SQLite C/C++ Interface文檔:

           本文檔提供了一個SQLite的 C/C++接口的簡單介紹。更早期的SQLite更加容易學習,因為它僅僅有5個C/C++接口。但是SQLite的性能已經增大,加入了新的C/C++接口,因此目前有185個獨立的API。這個接口數量對于新人來說太多了。幸好大多數的接口是用于專門的功能的,絕對不需要使用。盡管有這么多的接口,但是核心的API仍然是相對簡單,并且很容易用于編碼。文章旨在提供易于理解SQLite如何工作的簡單的背景信息。

           TheSQLite C/C++ Interface一文中提供了所有的C/C++ APIs的詳細描述。一旦讀者理解了操作SQLite的基本原理,那個文檔應該作為一個參考指南。本文僅僅是一個介紹,既不是SQLite的完整的文檔也不是權威的參考。

           1.0 核心對象和接口

           SQL數據庫引擎最重要的任務就是評估SQL語句。為了完成這個任務,開發(fā)人員需要知道兩個東西:

           數據庫連接對象:sqlite3

           準備語句對象: sqlite3_stmt

           嚴格來講,準備語句對象并不需要,因為這些普通的包裝接口,例如sqlite3_exec或sqlite_get_table,已經封裝隱藏了準備語句對象。盡管這樣,理解準備語句對象可以更好地使用SQLite。

           數據庫連接對象和準備語句對象有一些撮C/C++接口例程控制:

           sqlite3_open()

    sqlite3_prepare()

    sqlite3_column()

    sqlite3_finalize()

    sqlite3_close()

          

           這六個C/C++接口例程和兩個對象構成了SQLite的核心功能。開發(fā)者理解這些可以幫助更好地使用SQLite。

           注意這個例程列表是概念的,而不是實際的。這些例程中有一些有很多個版本。例如上面列表中有一個例程名字為sqlite3_open(),實際上有三個獨立的例程來完成相同的任務,但是有一些小小的區(qū)別:sqlite3_open(),sqlite3_open16(),sqlite3_open_v2()。列表中有sqlite3_column(),實際上就沒有這個例程存在。本條僅僅用于表明一個完整的例程家族,他們可以用于抽取不同類型的列的數據。

           如下是這些核心接口所作工作的總結:

           sqlite3_open()這個例程打開一個到SQLite數據庫的連接,返回一個數據庫連接對象。這一條往往是應用程序首先實行的例程,是其他SQLite API的預備。許多SQLite的接口要求一個到數據庫連接對象的指針作為第一個參數,可以被當作是數據庫連接對象的方法。這個例程是數據庫連接對象的例程。

           Sqlite3_prepare()    這個函數將SQL的文本轉換為一個準備語句對象,返回一個到這個對象的指針。接口要求一個連接對象指針,以及一個SQL語句的文本字符串。這條API并不實際地球SQL 語句的值,它只是準備用于求值的SQL語句。

           注意:sqlite3_prepare()并不推薦用于新的應用程序,推薦使用sqlite3_prepare_v2()。

    sqlite3_step() 用于求一個準備語句的值,也即前面sqlite3_prepare()方法準備的準備語句。這條語句被求值,結果指向可用結果的第一行。要想轉向第二行數據,再次調用sqlite3_step()。繼續(xù)調用sqlite3_step()知道語句完成。不返回結果的語句,例如insert,update等,只需要調用一次本方法即可。

    sqlite3_column()方法從結果集的當前行中返回一列,每一次sqlite3_step()停在一行新的數據時,可以多次調用本方法獲取這一行的數據。正如上述注意中描述的,在實際中沒有本方法。作為替代,這里調用sqlite3_column()是作為整個返回一行中單列數據的函數族的占位符。有一些例程返回的是結果的大小,以及結果集中的列數。

    sqlite3_column_blob()

    sqlite3_column_bytes()

    sqlite3_column_bytes16()

    sqlite3_column_count()

    sqlite3_column_double()

    sqlite3_column_int()

    sqlite3_column_int64()

    sqlite3_column_text()

    sqlite3_column_text16()

    sqlite3_column_type()

    sqlite3_column_value()

     

           sqlite3_finalize()這個例程用于銷毀一個準備語句對象,每一個準備語句必須通過調用這個例程來進行銷毀,以免造成內存泄漏。

           sqlite3_close()這個例程用于關閉數據庫連接,與該連接相關的準備語句應該在調用本close函數之前調用finalized方法銷毀掉。

     

           1.1 核心例程與對象的典型使用方法

           一個應用程序想要使用SQLite,那么初始化時需要使用sqlite3_open()來創(chuàng)建一個簡單的數據庫連接對象。注意sqlite3_open();可以用于打開一個存在的數據庫文件或者創(chuàng)建和打開一個新的數據庫文件愛你。盡管許多應用程序僅僅使用一個數據庫連接,但是也沒有原因說明為什么不能夠多次調用sqlite3_open()方法打開多個數據庫連接,到多個數據庫,或到一個數據庫的多個連接。有時多線程的應用程序會為每一個線程創(chuàng)建獨立的數據庫連接。注意為了訪問兩個或多個數據庫,并不需要打開獨立的數據庫連接。一個單獨的數據庫連接可以用于訪問兩個或多個數據庫,使用ATTACH SQL命令即可。

           許多應用程序在關閉時使用sqlite3_close()方法來銷毀數據庫連接,或例如,一個應用程序或許打開數據庫文件作為File->Open菜單動作的,在對應的File->Close菜單中銷毀相應的數據庫連接。

           執(zhí)行SQL語句,可以按照如下的步驟:

           1.使用sqlite3_prepare()方法創(chuàng)建愛你一個準備語句。

           2.調用sqlite3_step()方法一次或多次來求準備語句的值

           3.對于查詢,可以調用sqlite3_column()來提取結果中的數據。

           4.使用sqlite3_finalize()來銷毀準備語句。

     

    2.0 對核心例程的方便接口包裝

           sqlite3_exec()接口是一個方便的接口,它包含了上述的四個步驟。傳進sqlite3_exec()的結構是用于處理結果集的每一行數據。sqlite3_get_table()是另外一個方便的接口,它也包含了上述的四個步驟,該接口不同于exec,它將查詢的結果存在堆中,而不是調用回調函數。

           需要注意的是不論sqlite3_exec()方法或sqlite3_get_table()所做的事情,都可以使用核心例程完成。事實上,這些包裝是用這些核心例程實現的。

           3.0 綁定參數和重用準備語句

           在前面的討論中,假設每一個SQL語句只是準備一次,求值,然后銷毀。然而,SQLite以內需一些準備語句求值多次,這個功能可以通過如下的方法實現。

           sqlite3_reset();

           sqlite3_bind();

           在一個準備語句通過一次或多次的sqlite_step()的調用求值后,可以通過調用sqlite3_reset();方法進行重置,這樣就可以被再次求值。對已存在的準備語句調用sqlite3_reset();方法而不是創(chuàng)建愛你一個新的準備語句,就不需要再次調用sqlite3_prepare()方法了。在許多的SQL語句中,運行sqlite3_prepare()的次數等于或大于sqlite_step()的次數。避免調用sqlite3_prepare()可以得到性能的提升。

           通過并不需要對一個相同的SQL語句執(zhí)行多余一次。更多的是想要執(zhí)行類似的語句,例如你可能想要執(zhí)行一個Insert語句多次,來插入不同的值。為了實現靈活性,SQLite允許SQL語句包含一些參數,這些參數與前面求值中的值綁定。這些值可以修改,然后可以對同一個準備語句調用多次。

           在SQLite中,無論哪里包含一個字符串,可以按照如下形式使用一個參數:

           ?

           ?NNN

           :AAA

           $AAA

           @AAA

           在上面的例子中,NNN是一個整數值,AAA是一個標識符,一個參數初始值為NULL,在調用sqlite3_reset()語句后第一次或立即調用sqlite3_step(),應用程序可以嗲用sqlite3_bind()接口去將值附帶給參數。每一次調用sqlite3_bind()將覆蓋前面的相同參數的綁定。

           應用程序提前允許準備多個SQL語句,然后再需要時進行求值。對于準備語句的數量沒有限制。

           4.0 擴展SQLite

           SQLite包含了一些可以擴展它功能的方法,例如:

           sqlite3_create_collation()

    sqlite3_create_function()

    sqlite3_create_module()

           sqlite3_create_collation()接口用于創(chuàng)建新的校對序列用于排序文本。sqlite3_create_function()接口用于注冊新的虛擬表實現。sqlite3_create_module()接口用于創(chuàng)建新的SQL函數。這個新的函數實現使用如下的額外接口。

    sqlite3_aggregate_context()

    sqlite3_result()

    sqlite3_user_data()

    sqlite3_value()

    所有的內建SQL功能使用這些接口實現。參考SQLite的源碼,特別是date.c和func.c源文件。

    5.0 其他的接口

    這篇文章僅僅提到了一些基本的SQLite接口,SQLite庫包含了許多其他的API實現,在這里并沒有進行描述。完整的函數列表可以在C/C++Interface Specification中找到。參考這個文檔獲得SQLite接口的完整的權威信息。

      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多

      主站蜘蛛池模板: 怡红院一区二区三区在线| XXXXXHD亚洲日本HD| 少妇办公室好紧好爽再浪一点| 欧美孕妇乳喷奶水在线观看 | 无码国模国产在线观看免费| 日韩国产亚洲一区二区三区| 日韩少妇人妻vs中文字幕| 成人做受视频试看60秒| 一本一道久久A久久精品综合| 2020国产欧洲精品网站| 久久久久亚洲AV成人网人人网站| 精品人妻中文字幕av| 亚洲AV无码久久久久网站蜜桃 | 国产精品人妻久久无码不卡| 八区精品色欲人妻综合网| 亚洲国产福利成人一区二区| 亚洲国产精品综合久久2007| 秋霞鲁丝片成人无码| 日韩av中文字幕有码| 欧美性XXXX极品HD欧美风情| 国产色无码专区在线观看| 三级三级三级A级全黄| 蜜臀久久精品亚洲一区| 午夜三级A三级三点在线观看| 国产一区二区三区导航| 中文字幕AV无码人妻| 亚洲欧洲日产国码无码AV喷潮| 樱花草视频www日本韩国| 久久久亚洲欧洲日产国码农村| 西西人体大胆444WWW| 无码国产精品一区二区高潮| 无码人妻丰满熟妇啪啪网不卡| 国产午夜影视大全免费观看| 亚洲熟妇无码一区二区三区 | 韩国无码AV片午夜福利| 一本一道久久A久久精品综合 | 亚洲AV无码不卡私人影院| 色狠狠色噜噜AV一区| 成人午夜在线观看日韩| 无码国产精品一区二区免费式影视| 老司机午夜精品视频资源|