Подтвердить что ты не робот

Выполнять команды sqlite3 "dot" из Python или сортировать регистры в утилите командной строки

Моя база данных sqlite3 содержит ограничение столбца "collate". Я поместил его в схему для таблицы, чтобы предотвратить случайное пренебрежение использованием необходимой сортировки. Однако это означает, что при запуске 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, если необходимые функции сортировки отсутствуют? В качестве альтернативы, как я могу выполнить команды sqlite3 dot из Python?

4b9b3361

Ответ 1

Вы можете загрузить новые последовательности и функции сортировки с помощью load_extension() встроенной функции SQLite или . загрузить в командной строке для SQLite. Очевидно, что расширения можно записать в C.

И вы не можете вызывать dot-команды из python, потому что dot-команды специфичны для инструмента командной строки командной строки.

Ответ 2

Команда .import в оболочке sqlite является встроенной командой. Он обрабатывается программой оболочки, а не SQL-движком, поэтому вы не можете выполнять ее как инструкцию SQL.

Чтение кода для SQLite shell.c, кажется, что .import - это просто цикл, считывающий строки из файла данных, разделяющий разделителя и передачи полей в качестве значений параметров в подготовленный оператор INSERT. Таким образом, вы должны легко имитировать поведение .import с помощью кода Python.

Я тестировал следующее с 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()

Ответ 3

Точечные команды доступны только для исполняемого файла sqlite3. Вам нужно будет заменить их эквивалентной комбинацией кода Python и вызовов DB-API, чтобы имитировать их поведение.

Ответ 4

Вы можете вызывать команды точек из Python, используя модуль подпроцесса, который в основном вызывает оболочку. Если вам нужно использовать несколько команд точек, вы можете передать их в виде отдельных аргументов оболочки - использование точки с запятой для их разделения не будет работать.

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