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

у меня есть следующий SQL в файле, пользователь.в 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 ответов


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

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

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


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

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

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


вот пример 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