SQLite - запустить многострочный сценарий SQL из файла? - PullRequest
46 голосов
/ 04 марта 2010

У меня есть следующий SQL в файле user.sql:

CREATE TABLE user
(
  user_id INTEGER PRIMARY KEY,
  username varchar(255),
  password varchar(255)
);

Однако при выполнении следующей команды:

sqlite3 my.db < user.sql 

Генерируется следующая ошибка:

Error: near line 1: near ")": syntax error

Я бы предпочел оставить SQL как есть, так как файл будет проверен в системе контроля версий и будет более понятным и читаемым, как сейчас Может ли SQL охватывать несколько строк, как это, или мне нужно поместить все это в одну строку?

Ответы [ 4 ]

27 голосов
/ 04 марта 2010

Я понимаю, что это не прямой ответ на ваш вопрос. Как упоминает Брайан, это может быть глупой проблемой с платформой.

Если вы взаимодействуете с SQLite через Python, вы, вероятно, избежите большинства проблем, связанных с платформой, и получите забавные вещи, такие как столбцы datetime: -)

Что-то вроде этого должно работать нормально:

import sqlite3

qry = open('create_table_user.sql', 'r').read()
conn = sqlite3.connect('/path/to/db')
c = conn.cursor()
c.execute(qry)
conn.commit()
c.close()
conn.close()
24 голосов
/ 07 февраля 2012

У меня была точно такая же проблема.

Тогда я заметил, что мой редактор (Notepad ++) сообщает формат Macintosh для конца строк.

Преобразование eols в стиль Unix превратило файл скрипта в формат, понятный sqlite3.

2 голосов
/ 04 марта 2010

Несколько строк не проблема. Может быть проблема с платформой, потому что я могу успешно запустить этот пример, используя SQLite3 3.6.22 на OS X 10.5.8.

1 голос
/ 05 августа 2012

Вот пример python Берни, обновленный для обработки исключений в сценарии вместо тихого сбоя (Windows 7, ActiveState Python 3.x)

import sqlite3
import os
import os.path
import ctypes

databaseFile = '.\\SomeDB.db'
sqlFile = '.\\SomeScripts.sql'

# Delete the old table
if os.path.isfile(databaseFile):
    os.remove(databaseFile)

# Create the tables
qry = open(sqlFile, 'r').read()
sqlite3.complete_statement(qry)
conn = sqlite3.connect(databaseFile)
cursor = conn.cursor()
try:
    cursor.executescript(qry)
except Exception as e:
    MessageBoxW = ctypes.windll.user32.MessageBoxW
    errorMessage = databaseFile + ': ' + str(e)
    MessageBoxW(None, errorMessage, 'Error', 0)
    cursor.close()
    raise
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...