使用SQLAlchemy+sqlacodegen生成ORM类时,表名末尾s缺失问题咨询
解决sqlacodegen生成ORM类时表名末尾"s"丢失的问题
这个问题其实是sqlacodegen默认的单数化处理逻辑在“搞鬼”:
sqlacodegen内部依赖inflect库,默认会把表名当作复数形式,自动转换为单数形式作为ORM类的名称。对于像employee_status这类本身是单数的表名,它错误地将status识别成了复数形式,单数化后就变成了statu,于是出现了类名末尾少"s"的情况。
下面是几种实用的解决方法:
方法一:禁用自动单数化(推荐)
在运行sqlacodegen时添加--no-singularize参数,工具就会停止对表名做单数化处理,类名将直接由表名的驼峰形式生成:sqlacodegen postgresql://your_user:your_password@your_host/your_db --no-singularize > models.py用这个命令生成的话,
employee_status表对应的类名就会是EmployeeStatus,完全符合预期。方法二:手动修正类名
如果已经生成了模型文件,直接修改类名也完全可行——因为ORM类的__tablename__属性已经正确指向了数据库表,修改类名不会影响程序和数据库的交互,只是让代码更符合命名规范。比如把:class EmployeeStatu(Base): __tablename__ = "employee_status" # ... 字段定义改成:
class EmployeeStatus(Base): __tablename__ = "employee_status" # ... 字段定义方法三:自定义单数化规则(进阶)
如果需要保留部分单数化逻辑但修正特定词的处理,可以修改inflect库的规则,或者对sqlacodegen进行二次开发。不过这个方法比较繁琐,除非有大量特殊表名需要处理,否则不推荐。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

