Ответ 1
У меня была точно такая же проблема.
Затем я заметил, что мой редактор (Notepad ++) сообщает формат Macintosh для конца строк.
Преобразование eols в стиль Unix превратило файл script в формат, который понял sqlite3.
У меня есть следующий 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 охватывать несколько строк, подобных этому, или мне нужно поместить все это в одну строку?
У меня была точно такая же проблема.
Затем я заметил, что мой редактор (Notepad ++) сообщает формат Macintosh для конца строк.
Преобразование eols в стиль Unix превратило файл script в формат, который понял 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.
Здесь приведен пример 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