You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:10:28