【发布时间】:2017-01-11 17:25:19
【问题描述】:
我正在尝试使用 python 将多行插入 SQLite DB。我有三张桌子:
大学A:
- 身份证
- 课程名称
- 课程代码
- 课程前缀
大学B:
- 身份证
- 课程名称
- 课程代码
- 课程前缀
课程地图:
- universityA_id(来自大学 A 的引用 id)
- universityB_id(来自大学 B 的参考 id)
- is_flagged(布尔值 0/1)
我可以使用以下语法轻松地将单个记录添加到 CourseMap 表:
cur.execute('INSERT INTO CourseMap (universityA_id, universityB_id, is_flagged) VALUES ( (SELECT id from universityA WHERE course_code=301 AND course_prefix="AERO"), (SELECT id from universityB WHERE course_code=101 AND course_prefix="ARCH"), 0)')
但是当我尝试将此语句合并到一个列表中以使用executemany() 执行多个插入时,我得到一个语法错误:
equivs = [
((SELECT id from universityA WHERE course_code=301 AND course_prefix="AERO"), (SELECT id from universityB WHERE course_code=101 AND course_prefix="ARCH"), 0),
((SELECT id from universityA WHERE course_code=301 AND course_prefix="AERO"), (SELECT id from universityB WHERE course_code=101 AND course_prefix="ARCH"), 0),
((SELECT id from universityA WHERE course_code=301 AND course_prefix="AERO"), (SELECT id from universityB WHERE course_code=101 AND course_prefix="ARCH"), 0)
]
# Fill the table
cur.executemany('INSERT INTO courseMap (universityA_id, universityB_id, is_flagged) VALUES (?,?,?)', equivs)
我得到的错误是“语法错误:无效语法”,插入符号位于第一次插入的布尔值 is_flagged 之前。
我在executemany() 的多重插入语法中遗漏了什么吗?我的 SQLite 3 版本是 3.10.0。
【问题讨论】:
-
equivs声明中的选择语句是否应该是字符串? -
我的想法是它们不应该是,因为它们将插入的
INSERT语句是一个字符串...你的意思是equivs中的项目应该用引号引起来吗? -
是的。我不确定您是如何在 that 到达
executemany语句之前没有收到语法错误的。 -
澄清一下,每个
SELECT之前和每个"AERO"和"ARCH"之后都应该有引号(单引号,因为您在选择中有双引号)。 -
其实我的错。看起来他们需要在括号之外。