Flask SQLAlchemy插入数据报错:'function'对象无translate属性
解决AttributeError: 'function' object has no attribute 'translate'问题
这个报错的根源其实很典型——你踩了Python内置关键字/函数的坑!
看你的代码,模型里的字段命名为type,这是Python的内置函数(就是用来获取对象类型的那个type())。更关键的是,你在创建Test实例的时候,大概率不小心把type这个内置函数当成参数传给了type_,导致self.type被赋值成了一个函数对象,而不是你预期的字符串。当SQLAlchemy把这个函数对象传给PyMySQL做转义时,PyMySQL的_escape_unicode函数试图调用它的translate方法,函数当然没有这个属性,于是就抛出了这个错误。
给你两个解决方案,按需选择:
方案1:修改字段名,彻底避开冲突
这是最稳妥的做法,把模型里的type字段改成不会和内置函数冲突的名字,比如user_type:
from db import db class Test(db.Model): __tablename__ = "auth_test" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.Text) password = db.Column(db.Text) email = db.Column(db.Text) user_type = db.Column(db.Text) # 重命名字段 def __init__(self, username, password, email, user_type): self.username = username self.password = password self.email = email self.user_type = user_type db.session.add(self) db.session.commit()
如果数据库表已经创建,记得同步修改表的字段名,或者用Flask-Migrate这类工具做数据库迁移,避免数据结构不匹配。
方案2:保留字段名,但确保传入正确参数
如果你因为业务需求必须保留type作为字段名,那一定要严格保证创建实例时传入的type_参数是字符串,绝对不能传type这个内置函数。比如:
# 正确调用:传入字符串类型的用户类型 new_test = Test("alice", "mypassword", "alice@test.com", "user")
千万不要写成下面这种错误形式:
# 错误调用:把内置函数type传进去了 new_test = Test("alice", "mypassword", "alice@test.com", type)
另外提个小建议:尽量别在模型的__init__方法里直接调用db.session.add()和db.session.commit()。这种写法会把数据持久化的逻辑和模型绑定死,不够灵活——比如你想批量添加多个实例再一次性提交,或者需要处理事务回滚时就很麻烦。更好的做法是把提交逻辑放到业务层:
# 模型类只负责定义结构和初始化 class Test(db.Model): __tablename__ = "auth_test" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.Text) password = db.Column(db.Text) email = db.Column(db.Text) user_type = db.Column(db.Text) def __init__(self, username, password, email, user_type): self.username = username self.password = password self.email = email self.user_type = user_type # 业务逻辑里处理添加和提交 new_test = Test("alice", "mypassword", "alice@test.com", "user") db.session.add(new_test) db.session.commit()
这样代码的职责更清晰,扩展性也更好。
内容的提问来源于stack exchange,提问作者moluwole
相关产品推荐
相关产品推荐

