从Python执行sqlite3“dot”命令或在命令行实用程序中注册排序规则

时间:2010-02-27 03:05:16

标签: python sqlite collation

我的sqlite3数据库包含“collat​​e”列约束。我把它放在桌子的架构中,以防止意外地忽略使用必要的整理。但是,这意味着从命令行运行sqlite3而不是从我的Python代码运行时,架构中引用的排序规则不存在,我无法使用点命令。

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 dot命令。

如果没有必要的归类功能,如何执行sqlite3 dot命令?或者,我如何从Python执行sqlite3 dot命令?

6 个答案:

答案 0 :(得分:8)

sqlite shell中的.import命令是内置命令。它由shell程序而不是SQL引擎处理,因此您无法像SQL语句那样执行它。

读取SQLite shell.c的代码,似乎.import只是一个循环,从数据文件中读取行,在分隔符上拆分,并将字段作为参数值传递给准备好的{{ 1}}陈述。因此,您应该能够轻松地使用Python代码模仿INSERT的行为。

我使用Python 2.6测试了以下内容:

.import

答案 1 :(得分:7)

点命令仅适用于sqlite3可执行文件。您必须使用Python代码和DB-API调用的等效组合替换它们,以模仿它们的行为。

答案 2 :(得分:7)

您可以在SQLite的命令行shell中使用load_extension()内置SQLite函数或.load命令加载新的整理顺序和函数。显然,扩展应该用C语言编写。

你不能从python中调用dot-commands,因为dot-commands特定于命令行shell工具。

答案 3 :(得分:7)

您可以使用子进程模块从Python调用dot命令,该模块基本上调用shell。如果你需要使用多个点命令,你可以将它们作为单独的shell参数传递 - 使用分号分隔它们不会起作用。

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

答案 4 :(得分:3)

用于SQLite的APSW Python包装程序确实包含一个与SQLite兼容的外壳。您还可以扩展它以添加更多您自己选择的命令,其他输出模式等。(披露:我是APSW的作者。)

答案 5 :(得分:0)

subprocess.run()胜过subprocess.call()。以下是我的答案:

import subprocess
schema = subprocess.run(
    ['sqlite3',
     'xxx.db',
     '.schema'
    ],
    capture_output=True
).output.decode('utf-8')

print(schema)