python3 mysql 语句执行错误问题

本文记录了一次使用特定API执行SQL语句时遇到的错误:abytes-like object is required, not 'int'。错误原因是尝试向自增列插入超过65536的整数。解决方法为更改ID字段属性为非自增。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天执行如下语句,一直报错:

q = "insert into %s(id) values('%s')" % (newestTableName, StockCode)
sql.ExecNonQuery_debug(q)

错误:a bytes-like object is required, not 'int'


找到原因:id是自增列,用此API后,ID不能超过65536,所以将ID改为非自增,即解决。

<think>好的,用户之前已经询问过关于Python中connect()函数的使用,特别是连接数据库的相关内容。现在用户的新问题是关于如何用Python链接MySQL数据库并执行SQL语句。我需要先回顾之前的回答,确保这次回答不重复,同时补充具体的执行SQL步骤。 首先,用户可能已经了解connect()的基本用法,但这次需要更详细的操作步骤,包括连接后的执行语句流程。需要明确的是,用户可能需要一个从连接到执行查询的完整示例,包括如何插入、查询数据以及错误处理。 接下来,我要考虑用户可能的实际应用场景。可能是开发一个需要与MySQL交互的Python应用,比如Web后端或者数据处理脚本。用户可能对数据库操作不太熟悉,所以需要详细说明每一步骤,包括导入库、建立连接、创建游标、执行SQL、提交事务和关闭连接。 另外,用户可能关心异常处理和资源管理,比如如何避免连接泄漏,确保即使在出错的情况下也能正确关闭连接。所以在回答中需要包含try-except块和finally子句的使用,或者推荐使用上下文管理器(with语句),这在之前的回答中也提到过,但需要在这里再次强调。 还需要注意不同驱动的兼容性。比如,用户可能使用pymysql或者mysql-connector-python,两者的参数可能略有不同,但基本步骤相似。可能需要指出不同驱动之间的差异,但为了简洁,可以统一使用pymysql作为示例,并提到其他可选驱动。 此外,用户可能对SQL注入不太了解,所以示例中应该使用参数化查询,而不是字符串拼接,以提高安全性。需要强调这一点,避免用户在实际应用中出现安全漏洞。 最后,考虑到用户可能需要实际操作,示例代码应该完整且可运行,包括必要的占位符替换,如主机名、用户名、密码、数据库名等。同时,执行查询后的结果获取方式也需要说明,比如使用fetchone()、fetchall()等方法。 总结起来,回答的结构应该是:导入库、建立连接、创建游标、执行SQL(包括增删改查)、处理异常、关闭连接。每个步骤给出代码示例和解释,并附上完整示例。同时,强调安全性和资源管理的重要性。</think>以下是使用Python连接MySQL数据库并执行SQL语句的完整指南: --- ### 一、准备工作 1. **安装驱动**(任选其一) ```bash # 使用PyMySQL驱动 pip install pymysql # 或使用官方驱动 pip install mysql-connector-python ``` 2. **创建测试表** ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE ); ``` --- ### 二、基础操作流程 #### 1. 建立连接 ```python import pymysql # 基础连接配置 conn = pymysql.connect( host=&#39;localhost&#39;, # 数据库服务器地址 user=&#39;your_username&#39;,# 数据库用户名 password=&#39;your_password&#39;, database=&#39;your_database&#39;, charset=&#39;utf8mb4&#39;, # 推荐字符集 port=3306, # 默认MySQL端口 cursorclass=pymysql.cursors.DictCursor # 返回字典格式数据 ) ``` #### 2. 创建游标对象 ```python cursor = conn.cursor() # 获取操作游标 ``` #### 3. 执行SQL语句 **👉 查询操作示例** ```python try: # 参数化查询(防SQL注入) sql = "SELECT * FROM users WHERE name = %s" cursor.execute(sql, (&#39;张三&#39;,)) # 获取结果 results = cursor.fetchall() for row in results: print(f"ID: {row[&#39;id&#39;]}, 姓名: {row[&#39;name&#39;]}") except pymysql.Error as e: print(f"查询错误: {str(e)}") ``` **👉 插入/更新操作** ```python try: insert_sql = """ INSERT INTO users (name, email) VALUES (%s, %s) """ cursor.execute(insert_sql, (&#39;李四&#39;, &#39;lisi@example.com&#39;)) conn.commit() # 必须显式提交事务 print("插入成功,影响行数:", cursor.rowcount) except pymysql.IntegrityError as e: conn.rollback() # 唯一约束等错误回滚 print("违反唯一约束:", str(e)) ``` --- ### 三、完整示例代码 ```python import pymysql def mysql_operation(): conn = None try: # 建立连接 conn = pymysql.connect( host=&#39;localhost&#39;, user=&#39;root&#39;, password=&#39;mypassword&#39;, database=&#39;test_db&#39;, charset=&#39;utf8mb4&#39; ) # 使用上下文管理器管理游标 with conn.cursor() as cursor: # 插入数据 cursor.execute( "INSERT INTO users (name, email) VALUES (%s, %s)", (&#39;王五&#39;, &#39;wangwu@example.com&#39;) ) # 查询验证 cursor.execute("SELECT LAST_INSERT_ID() AS new_id") new_id = cursor.fetchone()[&#39;new_id&#39;] print(f"新记录ID: {new_id}") conn.commit() # 提交事务 except pymysql.MySQLError as e: print(f"数据库错误: {e}") if conn: conn.rollback() finally: if conn: conn.close() # 确保连接关闭 print("连接已关闭") if __name__ == "__main__": mysql_operation() ``` --- ### 四、高级技巧 #### 1. 批量插入数据 ```python data = [ (&#39;张三&#39;, &#39;zhangsan@test.com&#39;), (&#39;李四&#39;, &#39;lisi@test.com&#39;), (&#39;王五&#39;, &#39;wangwu@test.com&#39;) ] cursor.executemany( "INSERT INTO users (name, email) VALUES (%s, %s)", data ) conn.commit() ``` #### 2. 获取自增ID ```python cursor.execute("INSERT ...") new_id = cursor.lastrowid # 直接获取自增ID ``` #### 3. 事务管理 ```python try: cursor.execute("UPDATE accounts SET balance = balance - 100 WHERE id=1") cursor.execute("UPDATE accounts SET balance = balance + 100 WHERE id=2") conn.commit() # 同时成功才提交 except: conn.rollback() # 任意失败则回滚 ``` --- ### 五、常见错误处理 | 错误类型 | 触发场景 | 解决方案 | |--------------------------|--------------------------|------------------------------| | `OperationalError` | 连接参数错误/网络中断 | 检查连接参数,验证网络连通性 | | `ProgrammingError` | SQL语法错误 | 使用SQL客户端验证语句合法性 | | `IntegrityError` | 违反唯一约束/外键约束 | 添加异常处理,回滚事务 | | `DataError` | 数据类型不匹配 | 检查插入数据格式 | --- ### 六、性能优化建议 1. **连接池管理**:使用`DBUtils`库实现连接复用 2. **批量操作**:优先使用`executemany()`代替单条插入 3. **索引优化**:对WHERE条件字段建立索引 4. **查询缓存**:对频繁读取且不常变的数据使用缓存机制 --- ### 七、安全注意事项 1. **参数化查询**:永远不要拼接SQL字符串 ```python # 危险做法 ❌ cursor.execute(f"SELECT * FROM users WHERE name = &#39;{user_input}&#39;") # 正确做法 ✅ cursor.execute("SELECT * FROM users WHERE name = %s", (user_input,)) ``` 2. **最小权限原则**:数据库账号只授予必要权限 3. **加密连接**:生产环境使用SSL连接 ```python conn = pymysql.connect( ..., ssl={&#39;ca&#39;: &#39;/path/to/ca.pem&#39;} ) ``` --- 通过以上步骤,您可以安全高效地在Python中操作MySQL数据库。实际开发中建议结合ORM框架(如SQLAlchemy)进行更高级的数据库操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值