Python中peewee ORM出现InternalError: (1054, u"Unknown column 't1.pk' in 'field list'")如何解决?
大家好,我用 peewee 建标的时候出现一个问题, 当我查询 MyModel.select().first()报错 InternalError: (1054, u"Unknown column 't1.pk' in 'field list'") , 不用 mysql connection pool 的时候没问题. 也可以 MyModel.create(other_field='XXX')新建数据 .
from peewee import *
from playhouse.db_url import connect
mysql_db = connect('mysql+pool://root:[email protected]:3306/test?max_connections=20&stale_timeout=300')
class MySqlPrimaryKeyAutoIncrementField(BigIntegerField):
def init(self, *args, **kwargs):
kwargs[‘primary_key’] = True
super(MySqlPrimaryKeyAutoIncrementField, self).init(*args, **kwargs)
def __ddl__(self, column_type):
ddl = super(MySqlPrimaryKeyAutoIncrementField, self).__ddl__(column_type)
return ddl + [SQL('auto_increment')]
class MyModel(Model):
pk = MySqlPrimaryKeyAutoIncrementField()
other_field = TextField()
class Meta:
db_table = ‘my_model’
database = mysql_db
请问有人遇到么
Python中peewee ORM出现InternalError: (1054, u"Unknown column 't1.pk' in 'field list'")如何解决?
这个错误通常是因为Peewee的模型定义和数据库表结构不一致导致的。最常见的情况是模型类中定义了primary_key=True的字段,但数据库表中没有对应的主键列。
让我给你一个完整的解决方案:
# 假设这是你的模型定义
from peewee import *
db = MySQLDatabase('my_database', user='root')
class User(Model):
# 错误示例:模型定义了id为主键,但数据库表可能没有这个字段
id = IntegerField(primary_key=True)
username = CharField()
class Meta:
database = db
db_table = 'users'
# 解决方案1:检查数据库表结构
# 首先确认你的数据库表是否有主键字段
def check_table_structure():
# 查看表结构
cursor = db.execute_sql('DESCRIBE users;')
for row in cursor.fetchall():
print(row)
# 或者直接查看是否有主键
cursor = db.execute_sql("""
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'my_database'
AND TABLE_NAME = 'users'
AND COLUMN_KEY = 'PRI'
""")
print("主键字段:", cursor.fetchall())
# 解决方案2:同步模型和数据库
def sync_model_with_db():
# 方法A:删除表并重建(开发环境)
db.drop_tables([User])
db.create_tables([User])
# 方法B:使用migrate工具(推荐生产环境)
# 安装:pip install peewee-migrate
# 然后使用迁移工具管理表结构变更
# 解决方案3:如果数据库表已有数据,手动修改表结构
def fix_table_structure():
# 如果数据库表没有主键,添加一个
db.execute_sql('ALTER TABLE users ADD COLUMN id INT PRIMARY KEY AUTO_INCREMENT;')
# 或者如果已有主键但字段名不匹配,修改模型定义
class User(Model):
# 假设数据库主键字段实际叫user_id
user_id = IntegerField(primary_key=True, column_name='id')
username = CharField()
class Meta:
database = db
db_table = 'users'
# 解决方案4:检查是否使用了错误的表别名
def check_query():
# Peewee默认会给表加别名t1,如果查询中引用了不存在的列就会报错
# 确保查询的字段在表中都存在
query = User.select() # 这会生成 SELECT t1.id, t1.username FROM users AS t1
# 如果User模型有外键关系,确保关联的字段存在
# 错误的关联查询也会导致这个错误
# 快速诊断步骤
def diagnose():
# 1. 打印生成的SQL
query = User.select().limit(1)
print("生成的SQL:", query)
# 2. 检查模型字段
print("模型字段:", User._meta.fields)
# 3. 验证连接
try:
db.connect()
print("数据库连接正常")
except Exception as e:
print(f"连接错误: {e}")
# 执行诊断
if __name__ == '__main__':
diagnose()
check_table_structure()
关键点总结:
- 首先运行
check_table_structure()查看数据库实际表结构 - 对比模型定义的字段和数据库实际字段是否一致
- 特别注意主键字段的名称和类型
- 如果是在已有表上开发,确保模型定义和表结构完全匹配
一句话建议: 确保Peewee模型定义与数据库表结构完全一致,特别是主键字段。
MySqlPrimaryKeyAutoIncrementField 这个字段不是很要紧,只是为了跟自己代码保持一致,所以放上来了。

