Выполните sqlite3 «точечные» команды из Python или зарегистрируйте параметры сортировки в утилите командной строки - PullRequest
18 голосов
/ 27 февраля 2010

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

Ответы [ 5 ]

8 голосов
/ 06 мая 2010

Команда .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()
7 голосов
/ 20 сентября 2017

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

import subprocess
subprocess.call(["sqlite3", "xxx.db", 
  ".mode tabs", 
  ".import file.tsv table_name"])
7 голосов
/ 06 мая 2010

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

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

7 голосов
/ 27 февраля 2010

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

3 голосов
/ 27 сентября 2018

Оболочка APSW Python для SQLite включает оболочку, совместимую с SQLite. Вы также можете расширить его, добавив дополнительные команды по вашему выбору, дополнительные режимы вывода и т. Д. (Раскрытие информации: я автор APSW.)

...