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

SQLite - запустить многострочный SQL script из файла?

У меня есть следующий 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 as-is, поскольку файл будет проверен в исходном элементе управления и будет более удобным и удобным для чтения, как сейчас. Может ли SQL охватывать несколько строк, подобных этому, или мне нужно поместить все это в одну строку?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Если вы взаимодействуете с 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()

Ответ 3

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

Ответ 4

Здесь приведен пример bernie python для обработки исключений в script вместо молчащего сбоя (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