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