You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用peewee与FastAPI在MySQL建表时出现safe_create_index属性错误如何解决

问题原因

你代码的核心错误是给Model的Meta类的database属性传递了字符串类型的数据库名,而非实例化后的数据库连接对象。
具体错误点如下:

  • 你定义的DATABASE = 'food_delivery'是纯字符串,仅用来初始化数据库连接时传递数据库名参数,真正可用的数据库实例是你后续创建的db = MySQLDatabase(...)对象
  • BaseModel和Customer的内部Meta类中,你都写了database = DATABASE,相当于给peewee传递了一个字符串作为数据库操作对象,当创建表需要调用safe_create_index方法时,字符串类型不存在该方法,就会抛出对应的AttributeError。
修复方案

只需要把两处Meta类中的database赋值从字符串DATABASE改为数据库实例db即可,另外因为Customer继承了BaseModel,不需要重复定义Meta中的database属性,代码可以简化:

DATABASE = 'food_delivery'
db = MySQLDatabase(
    host='localhost',
    user='my_user',
    password='****',
    database=DATABASE
)

class BaseModel(Model):
    class Meta:
        database = db # 改为实例化的db对象

class Customer(BaseModel):
    city = CharField()
    customer = AutoField(column_name='customer_id')
    email = CharField(column_name='email_id',unique=True)
    first_name = CharField()
    landmark = CharField()
    last_name = CharField()
    password = CharField()
    phone_no = CharField(max_length=10)
    pincode = IntegerField()
    state = CharField()

    class Meta:
        table_name = 'customer'
        # 继承了BaseModel的database配置,此处无需重复声明
def create_tables():
    with db:
        db.create_tables([Customer])
create_tables()

修改后重新运行即可正常创建数据表。

内容的提问来源于stack exchange,提问作者Amar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:54:03