Windows下执行pydoc处理含SQLAlchemy模型文件时出错求助
解决pydoc处理Flask-SQLAlchemy模型时的ArgumentError错误
解决方案
方法1:把数据库操作代码放到主程序入口块
修改你的objects.py,将表创建/删除的代码放在if __name__ == '__main__':里面,这样pydoc导入模块时不会执行这些代码,同时避免pydoc解析类属性时触发不必要的数据库操作:
from flask import Flask from flask_sqlalchemy import SQLAlchemy import os app = Flask(__name__) app.app_context().push() app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:mycoolpassword@localhost:5432/mydb' db = SQLAlchemy(app) class Book(db.Model): """ Docstring for my class Col1 Col2 """ __tablename__ = 'mytable' col1 = db.Column(db.Integer, primary_key = True) col2 = db.Column(db.Integer) # 只有直接运行脚本时才执行数据库操作 if __name__ == '__main__': db.drop_all() db.create_all()
改完之后再执行python -m pydoc -w objects就能正常生成文档了。
方法2:临时屏蔽模型的query属性(可选)
如果不想调整代码结构,可以在模块里加一段判断,检测到是pydoc运行时,屏蔽掉模型的query属性:
# 在Book类定义之后添加 import sys if 'pydoc' in sys.modules: Book.query = None
不过这种方法不如第一种简洁,优先推荐方法1。
错误原因
问题出在pydoc生成文档的机制上:它会遍历类的所有属性,包括Flask-SQLAlchemy模型自带的query属性。这个属性是一个描述符,当pydoc用getattr访问它时,会触发SQLAlchemy创建Query对象,但pydoc运行的环境没办法正确初始化SQLAlchemy的查询上下文,于是就抛出了sqlalchemy.exc.ArgumentError。
另外,你原来的代码里,db.drop_all()和db.create_all()是写在顶层的,pydoc导入模块时就会执行这些代码,不光可能误操作数据库,还会加重模块加载的上下文负担,进一步引发这类问题。
内容的提问来源于stack exchange,提问作者ZIF
相关产品推荐
相关产品推荐

