2010-02-27 37 views
16

我的sqlite3數據庫包含「collat​​e」列約束。我已將它放在表格的模式中,以防意外忽略使用必要的排序規則。但是,這意味着從命令行運行sqlite3而不是從我的Python代碼運行時,模式中引用的排序規則不存在,我無法使用點命令。從Python執行sqlite3「dot」命令或在命令行實用程序中註冊排序規則

sqlite> .import data.txt table_name 
Error: no such collation sequence: my_collation 

此外,創建從Python的連接,並添加所需的整理運行到這個問題:

connWithCollation.execute(".import data.txt table_name") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: near ".": syntax error 

會出現execute功能不希望通過傳遞sqlite3的點命令。

如何在必要的排序功能不存在時執行sqlite3點命令?另外,我怎樣才能從Python執行sqlite3點命令?

回答

6

您可以在命令行shell中爲SQLite使用load_extension()內置SQLite函數或.load命令加載新的整理序列和函數。顯然,擴展名必須用C編寫。

而且您不能從python調用dot命令,因爲dot命令特定於命令行shell工具。

7

點命令僅適用於sqlite3可執行文件。您將不得不用Python代碼和DB-API調用的等效組合替換它們以模仿它們的行爲。

+1

有些命令看起來很瑣碎。你會如何添加標題或選擇列分隔符? – 2013-05-02 18:01:45

8

sqlite shell中的.import命令是一個內置命令。它是由shell程序處理的,而不是SQL引擎處理的,所以你不能像SQL語句那樣執行它。 SQLite的的shell.c

讀碼,似乎.import是一個簡單的循環,閱讀在分離器中從數據文件中的行,拆分,並通過該領域的參數值的準備INSERT聲明。所以你應該能夠很容易地用Python代碼模仿.import的行爲。

我測試與Python 2.6以下:

import sqlite3 
import csv 

conn = sqlite3.connect(':memory:') 

conn.execute('create table mytable (col1 text, col2 text, col3 text)') 

csvReader = csv.reader(open('mydata.csv'), delimiter=',', quotechar='"') 

for row in csvReader: 
     conn.execute('insert into mytable (col1, col2, col3) values (?, ?, ?)', row) 

cur = conn.cursor() 
cur.execute('select * from mytable') 
print cur.fetchall() 
+0

對我的問題的一半的一個很好的答案:) – 2010-05-06 02:31:34

+0

完美的答案/示例,以幫助任何人開始在Python的SQLite編程! – Blairg23 2016-04-11 21:34:06

0

可以從使用Python子進程模塊,它基本上調用一個調用殼點命令。如果您需要使用多個點命令,則可以將它們作爲單獨的shell參數傳遞 - 使用分號分隔它們將不起作用。

import subprocess 
subprocess.call(["sqlite3", "xxx.db", 
    ".mode tabs", 
    ".import file.tsv table_name"])