Spotify API提取数据存入MySQL时报表不存在错误,求解决方案
问题原因
你代码里先执行了DROP TABLE IF EXISTS spotify_api.spotify;,这行代码会直接删掉spotify_api库下的spotify表,但删掉之后你完全没重新创建这个表——哪怕之前手动建过表,每次运行代码都会把表删干净,后续插入数据自然会提示表不存在。
另外还有两个潜在问题:
- 直接拼接SQL语句会触发SQL注入风险,如果歌曲名里包含单引号(比如
Don't Stop),还会直接导致SQL语法错误。 - 要确认手动创建的
tracks和items列数据类型匹配:tracks存序号(整数)需设为INT类型,items存歌曲名需设为VARCHAR(255)或更长的字符串类型。
修正方案
方案1:保留手动创建的表
如果想保留之前手动建好的spotify表,直接删掉代码里的DROP TABLE那一行即可,这样每次运行代码不会删除已有表,直接插入数据。
方案2:自动创建表(推荐)
让代码自动处理表的创建,避免手动操作的麻烦,同时改用参数化查询规避SQL风险:
修正后的完整代码:
import spotipy from spotipy.oauth2 import SpotifyClientCredentials import mysql.connector # 连接数据库(已指定库,后续操作无需重复写库名前缀) mydb = mysql.connector.connect( host="localhost", user="root", password="你的数据库密码", database="spotify_api" ) mycursor = mydb.cursor() # 可选:每次运行清空旧表数据(不需要的话可以删掉这行) mycursor.execute('DROP TABLE IF EXISTS spotify;') # 自动创建表,定义匹配的列类型 mycursor.execute(''' CREATE TABLE spotify ( tracks INT, items VARCHAR(255) ) ''') # 连接Spotify API sp = spotipy.Spotify(auth_manager=SpotifyClientCredentials( client_id="你的Spotify Client ID", client_secret="你的Spotify Client Secret" )) results = sp.search(q='sza', limit=20) # 使用参数化查询插入数据,避免SQL注入和语法错误 for idx, track in enumerate(results['tracks']['items']): print(idx, track['name']) sql = "INSERT INTO spotify (tracks, items) VALUES (%s, %s)" val = (idx, track['name']) mycursor.execute(sql, val) mydb.commit() print(mycursor.rowcount, "条记录已插入。") # 查询验证结果 mycursor.execute("SELECT * FROM spotify;") myresult = mycursor.fetchall() for x in myresult: print(x) # 关闭资源 mycursor.close() mydb.close()
关键说明
- 因为连接数据库时已经指定了
database="spotify_api",后续操作表直接写表名spotify即可,无需再加spotify_api.前缀。 - 参数化查询用
%s作为占位符,参数放在元组里传给execute方法,这是Python操作MySQL的标准写法,能彻底避免字符串拼接带来的问题。 - 最后记得关闭数据库连接,避免资源泄漏。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

