2010-03-04 44 views
46

Tôi đã sau lệnh SQL trong một tập tin, user.sql:SQLite - Chạy tập lệnh SQL nhiều dòng từ tệp?

CREATE TABLE user 
(
    user_id INTEGER PRIMARY KEY, 
    username varchar(255), 
    password varchar(255) 
); 

Tuy nhiên, khi các lệnh sau đây được thực hiện:

sqlite3 my.db < user.sql 

Các lỗi sau đây được tạo:

Error: near line 1: near ")": syntax error 

Tôi muốn giữ nguyên SQL, vì tệp sẽ được kiểm tra vào kiểm soát nguồn và sẽ được duy trì và dễ đọc hơn như hiện tại. SQL có thể trải rộng trên nhiều dòng như thế này hay tôi cần phải đặt tất cả trên cùng một dòng?

+0

Khi bạn đã thử nó, những gì đã xảy ra? Bạn đã thử 'sqlite3 mydb.db

+0

Thông báo lỗi của bạn không có ý nghĩa gì nhiều khi so sánh với đoạn mã bạn đã cung cấp. Không có ")" trên dòng 1. Bạn có thể cung cấp mã thực tế từ 'user.sql' không? –

+0

Cũng xin lưu ý rằng một số DB không thích tập lệnh kết thúc mà không có (!) Một dòng trống. – KFleischer

Trả lời

24

Tôi đã có chính xác cùng một vấn đề.

Sau đó, tôi nhận thấy, trình soạn thảo của tôi (Notepad ++) báo cáo định dạng Macintosh cho cuối dòng.

Chuyển đổi eols thành kiểu Unix đã chuyển tệp tập lệnh thành định dạng, mà sqlite3 đã hiểu.

2

Nhiều dòng không phải là vấn đề. Có thể có một vấn đề nền tảng, bởi vì tôi có thể chạy ví dụ này thành công bằng cách sử dụng SQLite3 3.6.22 trên OS X 10.5.8.

20

Tôi nhận thấy đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn. Như Brian đã đề cập, đây có thể là một vấn đề nền tảng ngớ ngẩn.

Nếu bạn giao tiếp với SQLite qua Python, bạn sẽ có thể tránh được hầu hết các vấn đề nền tảng cụ thể và bạn có thể có những điều thú vị như cột datetime :-)

Something như thế này sẽ làm việc tốt:

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

Cảm ơn bạn vì mã hữu ích và ngắn gọn, @bernie. Đối với những người khác trong tương lai mà đi qua này: nếu bạn có nhiều hơn một tuyên bố trong tập tin SQL của bạn, chúng tôi c.executescript (qry) thay vì c.execute (qry) –

+0

Cảm ơn bạn đã bình luận của bạn, Jordan. Nó có khả năng là hữu ích cho độc giả tương lai của chủ đề này. Để thêm một ghi chú nhỏ về 'executescript()': [nó không phải là một phần tiêu chuẩn của DB-API] (http://docs.python.org/library/sqlite3.html#sqlite3.Connection.executescript), vì vậy một số thư viện cơ sở dữ liệu Python có thể không thực hiện nó. – bernie

1

Dưới đây là ví dụ python bernie của nâng cấp để xử lý ngoại lệ trong kịch bản thay vì âm thầm thất bại (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 
Các vấn đề liên quan