2010-03-04 2 views
46

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

+0

Когда вы пробовали, что случилось? Вы пробовали 'sqlite3 mydb.db

+0

Ваше сообщение об ошибке не имеет большого смысла по сравнению с предоставленным фрагментом кода. Там нет ")" в строке 1. Можете ли вы предоставить фактический код из 'user.sql'? –

+0

Также обратите внимание, что некоторым БД не нравятся сценарии, которые заканчиваются (!) Пустой строкой. – KFleischer

ответ

24

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

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

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

2

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

20

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

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

Нечто подобное должен работать нормально:

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() 
+14

Спасибо за полезный и сжатый код @bernie. Для других в будущем, которые сталкиваются с этим: если в вашем файле SQL имеется более одного оператора, мы c.executescript (qry) вместо c.execute (qry) –

+0

Спасибо за ваш комментарий, Иордания. Вероятно, это будет полезно для будущих читателей этой темы. Чтобы добавить незначительную заметку о 'executescript()': [это не стандартная часть DB-API] (http://docs.python.org/library/sqlite3.html#sqlite3.Connection.executescript), поэтому некоторые библиотеки Python-базы данных могут не реализовывать его. – bernie

1

Вот пример питона Берни модернизирован для обработки исключений в сценарии вместо беззвучно неудачи (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 
Смежные вопросы