使用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
相关产品推荐
相关产品推荐

