Выполните команды “точки” sqlite3 из Python или сопоставление регистра в утилите командной строки

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

Как я могу выполнить команды точки sqlite3, когда необходимые функции сопоставления не присутствуют? С другой стороны, как я могу выполнить команды точки sqlite3 из Python?

19
задан CL. 15 February 2017 в 08:29
поделиться

3 ответа

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

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

7
ответ дан 30 November 2019 в 03:43
поделиться

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

7
ответ дан 30 November 2019 в 03:43
поделиться

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

Читая код shell.c для SQLite, кажется, что .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()
8
ответ дан 30 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: