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