基于两个DataFrame用sqlite3创建musicten数据库并插入数据报错求助
解决SQLite插入数据失败的问题
原代码存在的问题
- 重复导入
sqlite3并重复连接数据库,属于冗余操作 - 创建
music表时使用SECONDARY KEY,SQLite不支持该语法,需改为普通列 - 插入日期时直接写
01/05/2009,会被Python解析为除法运算,而非日期字符串,需用引号包裹 - 字符串
'Let's go'中的单引号未转义,导致SQL语法错误,应改为'Let''s go'或用双引号包裹 - 直接插入
tuple([4,5])不符合SQL语法,需转换为字符串格式如'(4,5)' - 表字段名大小写不统一(创建时用
SONG_ID,插入时用Song_ID),虽然SQLite不区分,但建议保持一致
修正后的完整代码
import sqlite3 # 连接数据库并创建表 conn = sqlite3.connect('musicten.db') c = conn.cursor() # 创建singer表 c.execute(''' CREATE TABLE IF NOT EXISTS singer ([Singer_ID] INTEGER PRIMARY KEY, [Singer] TEXT, [nationality] TEXT) ''') # 创建music表,移除不支持的SECONDARY KEY,统一字段名大小写 c.execute(''' CREATE TABLE IF NOT EXISTS music ([Song_ID] INTEGER PRIMARY KEY, [Singer_ID] TEXT, [name] TEXT, [Date] TEXT, [Edition] INTEGER) ''') # 插入singer数据 c.execute(''' INSERT INTO singer (Singer_ID, Singer, nationality) VALUES (1, 'JT Watson', 'USA'), (2, 'Rafinha', 'Brazil'), (3, 'Juan Casa', 'Spain'), (4, 'Kidi', 'USA'), (5, 'Dede', 'USA') ''') # 插入music数据,修正日期、字符串转义、多值存储问题 c.execute(''' INSERT INTO music (Song_ID, Singer_ID, name, Date, Edition) VALUES (1, '1', 'LA', '01.05.2009', 1), (2, '2', 'Second', '13.07.2009', 1), (3, '1', 'Mexico', '13.07.2009', 1), (4, '3', 'Let''s go', '13.09.2009', 1), (5, '(4,5)', 'Hello', '18.09.2009', 1) ''') conn.commit() conn.close() # 关闭连接,释放资源
规范设计补充(可选)
如果需要更合理地存储多歌手关联关系,建议创建中间关联表music_singer,避免单个字段存储多值,方便后续查询:
# 创建中间关联表 c.execute(''' CREATE TABLE IF NOT EXISTS music_singer ([Song_ID] INTEGER, [Singer_ID] INTEGER, PRIMARY KEY(Song_ID, Singer_ID)) ''') # 插入关联数据 c.execute(''' INSERT INTO music_singer (Song_ID, Singer_ID) VALUES (1,1), (2,2), (3,1), (4,3), (5,4), (5,5) ''') # 此时可移除music表中的Singer_ID字段
内容的提问来源于stack exchange,提问作者user19965401
相关产品推荐
相关产品推荐

