web-dev-qa-db-ja.com

SQLite-ファイルから複数行のSQLスクリプトを実行しますか?

ファイルuser.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はこのように複数の行にまたがることができますか、それともすべてを同じ行に置く必要がありますか?

46
Justin Ethier

私はまったく同じ問題を抱えていました。

それから気づいたのですが、私のエディター(Notepad ++)はMacintosh形式の行末を報告します。

EolをUnixスタイルに変換すると、スクリプトファイルはsqlite3が理解できる形式に変換されました。

24
Jan Vlcinsky

これはあなたの質問に対する直接的な答えではないことを理解しています。ブライアンが言及しているように、これはばかげたプラットフォームの問題である可能性があります。

Pythonを介してSQLiteとインターフェイスする場合、おそらくプラットフォーム固有の問題のほとんどを回避でき、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()
27
bernie

複数の行は問題ではありません。 OS X 10.5.8でSQLite3 3.6.22を使用してこの例を正常に実行できるため、プラットフォームに問題がある可能性があります。

2
Brian Wisti

ここにbernieの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
1
Dirk Bester