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

Mat*_*ner 19 python sqlite collation

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

sqlite> .import data.txt table_name
Error: no such collation sequence: my_collation
Run Code Online (Sandbox Code Playgroud)

此外,从Python创建连接并添加所需的排序规则会遇到此问题:

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

execute它出现的功能不想通过sqlite3 dot命令.

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

pol*_*m23 9

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

import subprocess
subprocess.call(["sqlite3", "xxx.db", 
  ".mode tabs", 
  ".import file.tsv table_name"])
Run Code Online (Sandbox Code Playgroud)


Bil*_*win 8

.import在源码外壳命令是一个内置命令.它由shell程序而不是SQL引擎处理,因此您不能像SQL语句那样执行它.

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

我用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()
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 7

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

  • 有些命令似乎远非微不足道。您将如何添加标题或选择列分隔符? (2认同)

new*_*ver 7

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

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


Rog*_*nns 5

SQLite 的 APSW Python 包装器确实包含一个与 SQLite 兼容的 shell。您还可以扩展它以添加更多您自己选择的命令、额外的输出模式等。(披露:我是 APSW 作者。)