SQLite - 从文件运行多行SQL脚本?

时间:2010-03-04 15:43:42

标签: sqlite scripting

我在文件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可以跨越这样的多行,还是需要将它们全部放在同一行?

4 个答案:

答案 0 :(得分:26)

我意识到这不是你问题的直接答案。正如布莱恩所提到的,这可能是一个愚蠢的平台问题。

如果您通过Python与SQLite接口,您可能会避免大多数特定于平台的问题,并且您可以获得有趣的事情,例如日期时间列: - )

这样的事应该可以正常工作:

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

答案 1 :(得分:24)

我有完全相同的问题。

然后我注意到,我的编辑器(Notepad ++)报告了行结束的Macintosh格式。

将eols转换为Unix风格将脚本文件转换为sqlite3理解的格式。

答案 2 :(得分:2)

多行不是问题。可能存在平台问题,因为我能够在OS X 10.5.8上使用SQLite3 3.6.22成功运行此示例。

答案 3 :(得分:1)

这是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