2010-02-27 77 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"])