MySQL 8.0.31插入数据报1054错误:未知列'Jo',求解决方案
问题解决
1. 插入查询报错(1054 Unknown column)
报错原因
你拼接SQL语句时,没有给VARCHAR类型的字符串值加单引号,导致MySQL把self.player1和self.player2的内容当成了列名。比如如果self.player1的值是Jo,生成的SQL会是:
INSERT INTO `match`(player_1, player_2) VALUES (Jo, xxx);
MySQL会认为Jo是一个列名,但你的表中没有这个列,所以触发1054错误。
解决方法
绝对不要用字符串拼接构建带参数的SQL,这不仅会引发语法错误,还存在严重的SQL注入风险。改用参数化查询,利用MySQL驱动的参数绑定功能修改代码:
修改查询构建部分:
# 无需每次执行USE,连接数据库时可直接指定库名 query = "INSERT INTO `match`(player_1, player_2) VALUES (%s, %s);" # 调用带参数的查询执行函数 self.db_obj.execute_query_with_params(query, (self.player1, self.player2))
更新你的execute_query函数,支持参数传递:
def execute_query_with_params(self, query, params=None): cursor = self.connection.cursor() try: if params: cursor.execute(query, params) else: cursor.execute(query) self.connection.commit() print(f"{query} 执行成功") except Error as err: print(f"Error: '{err}'")
如果非要用字符串拼接(不推荐),必须给值加上单引号:
query = f"INSERT INTO `match`(player_1, player_2) VALUES ('{self.player1}', '{self.player2}');"
但这种方式如果值里包含单引号(比如O'Neil),会再次引发语法错误,所以强烈建议用参数化查询。
2. SELECT INTO OUTFILE 报错
报错原因
MySQL的--secure-file-priv参数限制了INTO OUTFILE和LOAD DATA INFILE的读写目录:
- 如果参数设为某个路径,只能导出到该路径下;
- 如果设为
NULL,则完全禁用该功能。
解决方法
- 查看当前参数值:
执行SQL:
SHOW VARIABLES LIKE 'secure_file_priv';
- 若结果是具体路径(比如
/var/lib/mysql-files/),将导出路径改为该目录:SELECT * FROM `match` INTO OUTFILE '/var/lib/mysql-files/test.txt'; - 若结果是
NULL,需修改MySQL配置文件:- 找到
my.cnf(Linux)或my.ini(Windows),添加/修改:secure_file_priv = /path/to/your/directory - 重启MySQL服务后生效。
- 找到
- 替代方案(无需修改MySQL配置):
用Python自行查询数据并写入文件:
def export_match_data(self, filename): cursor = self.connection.cursor() try: cursor.execute("SELECT * FROM `match`;") rows = cursor.fetchall() # 写入文件 with open(filename, 'w') as f: # 写入表头 headers = [desc[0] for desc in cursor.description] f.write('\t'.join(headers) + '\n') # 写入数据行 for row in rows: f.write('\t'.join(str(col) for col in row) + '\n') print(f"数据已导出到 {filename}") except Error as err: print(f"Error: '{err}'")
内容的提问来源于stack exchange,提问作者JCam989
相关产品推荐
相关产品推荐

