關係

2013-04-17 32 views
0

我有些疑惑的sqlite3和Python 2.x的關係

這裏的關係是輸出:

$ python 
Python 2.7.2+ (default, Jul 20 2012, 22:12:53) 
[GCC 4.6.1] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sqlite3 
>>> sqlite3.version 
'2.6.0' 
>>> sqlite3.sqlite_version 
'3.7.7' 

的 '3.7.7' 應該成爲我Ubuntu操作系統上的sqlite版本。

然而,當我試圖

sqlite3 test.db 
bash: sqlite3: command not found 

這意味着sqlite3的未在此機器上安裝。

然後我怎樣才能使用註記語句如 「PRAGMA編碼= 」UTF-8「,」在python中創建數據庫時?

+0

你真的在這裏問兩個問題;一個是關於Ubuntu的打包系統,另一個關於sqlite3(和Python)。對於第二個:爲什麼你想首先設置'PRAGMA encoding =「UTF-8」'? SQLite默認爲UTF-8,當Python創建一個新的數據庫時,它總是使用該默認值。 – abarnert

回答

4

第一:

的 '3.7.7' 應該是的SQLite在我的Ubuntu操作系統的版本。

不是。它是Python構建的sqlite庫的版本。

如果由於Python是針對靜態庫建成,沒有理由期望以任何方式關係到你的系統上其他任何東西。即使是對一個共享庫建成,它不來是已通過你的發行版的默認sqlite包使用(雖然它通常是)相同的共享庫。

而且,即使Python的建立針對相同的共享庫那是你的發行版的默認共享庫:Ubuntu的,像許多發行版,可以安裝最libfoo.so共享庫,而無需安裝foo命令行工具。

特別是,如果你看一下Ubuntu的軟件包(至少在最新版本),還有在libsqlite3包sqlite的共享庫,並且兩個pythonsqlite3取決於libsqlite3包。

所以,如果你想sqlite3命令行工具,您必須安裝它;你不會通過安裝Python自動獲取它。


同時:

有沒有辦法使用PRAGMA編碼= 「UTF-8」 一個Python代碼裏面?

肯定。 A PRAGMA只是一個影響會話其餘部分的SQL語句。無論您是在命令行工具中執行還是在Python execute命令中執行它,或通過加載SQL腳本等來執行它都沒關係。只需執行它即可。

然而,正如你在評論中指出,根據the docs,這個特殊的編譯不會有,除非你能之前運行連接到數據庫的任何影響。因爲DB-API 2。0(Python sqlite3模塊以及大多數其他Python數據庫模塊都構建的API)沒有任何方式在未連接狀態下執行語句,但沒有簡單的方法。

可以,當然,考慮的各種備選(通常沒有很好地測試,並且更慢)sqlite3的實現的用於Python或叉和修改the sourcepysqlite(即週期性地納入STDLIB作爲sqlite3模塊) 。

如果你想這樣做,看的地方是在connection.cpysqlite_connection_init功能。您可能不想添加通用的預連接編譯指示支持,而是通過另一個參數來控制編碼的方式,以connect。請參閱open文檔sqlite3以瞭解您可以在此處進行的有用操作。 (然後你可能想要提交一個bug並提交一個補丁,但它永遠不會成爲Python 2.x,但任何在pysqlite中被接受的東西最終都會以Python 3.x結尾)。但是更簡單的方法就是你想要做的事情:在Python之外創建數據庫。只需以您最喜歡的方式安裝sqlite3軟件包(apt-get,其中一個GUI包裝器,無論如何)並使用它。


最後一兩件事:從我可以告訴,這取決於你的版本,Python的模塊將既可以使用UTF-8明確,或使用默認的編碼,這將是UTF-8。所以,你不需要在這裏做任何事情。

+0

嗯,我想我需要先從http://docs.python.org/2/library/sqlite3.html連接到像'conn = sqlite3.connect('example.db')'這樣的數據庫。然後數據庫已經使用默認編碼創建。 「在創建數據庫後,不可能更改數據庫的文本編碼,任何試圖這樣做的嘗試都將被默默忽略。」 http://www.sqlite.org/pragma.html如果您執行A PRAGMA,它不會影響現有的數據庫。 –

+0

@GabySolis:你說得對,Python的DB-API 2.0並沒有提供任何方式來在創建/加載主數據庫之前運行命令,或者直接從轉儲文件創建數據庫。所以,如果你想用預先運行的任何命令創建一個數據庫,你必須在Python之外這樣做。 – abarnert