使用Python的MySQL Connector库存储数据失败求助
问题排查与修复方案
我来帮你梳理下代码里的几个关键问题,这就是数据没法存入MySQL的核心原因:
1. SQL语法错误+注入风险
你直接用f-string拼接SQL语句的方式有问题:字符串类型的email和passw没有被引号包裹,比如当你输入test@mail.com作为邮箱时,生成的SQL会是INSERT INTO id(email, passw) VALUES(test@mail.com,123456);——MySQL会把test@mail.com当成标识符而非字符串值,直接报错。同时这种写法还存在严重的SQL注入风险。
正确的做法是用MySQL Connector支持的参数化查询,它会自动处理字符串的引号和转义:
mycursor.execute("INSERT INTO id(email, passw) VALUES(%s, %s);", (email, passw))
2. 未提交事务
MySQL Connector默认关闭了自动提交功能,你执行完INSERT语句后,数据只是存在于当前会话的缓存里,并没有真正写入数据库。必须调用mydb.commit()来提交事务,才能让数据持久化。
3. 重复创建数据库/表会报错
每次运行代码都会执行CREATE DATABASE login;和CREATE TABLE id (...),第二次运行时因为数据库和表已经存在,会直接抛出错误,导致后续逻辑无法执行。应该改成仅当对象不存在时创建:
mycursor.execute("CREATE DATABASE IF NOT EXISTS login;") # ... mycursor.execute("CREATE TABLE IF NOT EXISTS id (email VARCHAR(20), passw VARCHAR(20));")
修正后的完整代码
import mysql.connector mydb = mysql.connector.connect( host="localhost", user="root", passwd="" ) mycursor = mydb.cursor() # 仅在数据库不存在时创建 mycursor.execute("CREATE DATABASE IF NOT EXISTS login;") mycursor.execute("USE login;") # 仅在表不存在时创建 mycursor.execute("CREATE TABLE IF NOT EXISTS id (email VARCHAR(20), passw VARCHAR(20));") # 注册逻辑 email = input("Your email: ") passw = input("Your password: ") confirm_pass = input("Confirm password: ") if passw == confirm_pass: print("Successfully registered!") # 参数化插入+事务提交 mycursor.execute("INSERT INTO id(email, passw) VALUES(%s, %s);", (email, passw)) mydb.commit() else: print("Wrong password!")
内容的提问来源于stack exchange,提问作者user11363434
相关产品推荐
相关产品推荐

