执行包含SQLAlchemy模型的文件时出现pydoc错误

0 投票
1 回答
29 浏览
提问于 2025-04-12 12:14

我在我的Windows电脑上尝试运行pydoc来处理一个Python文件。这个文件里有SQLAlchemy模型,但我遇到了一个错误,搞得我很头疼。

如果能得到一些指导,我会非常感激。下面是我执行的命令、目标Python文件和我遇到的错误。

我的命令是这样的: python -m pydoc -w objects

这是我的Python文件,叫做objects.py。

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)

db.drop_all()
db.create_all()

这是我收到的错误信息。

$ python -m pydoc -w objects
Traceback (most recent call last):
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 194, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 2744, in <module>
    cli()
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 2704, in cli
    writedoc(arg)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 1697, in writedoc
    page = html.page(describe(object), html.document(object, name))
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 380, in document
    if inspect.ismodule(object): return self.docmodule(*args)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 738, in docmodule
    contents.append(self.document(value, key, name, fdict, cdict))
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 381, in document
    if inspect.isclass(object): return self.docclass(*args)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 843, in docclass
    for name, kind, cls, value in classify_class_attrs(object)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\pydoc.py", line 204, in classify_class_attrs
    for (name, kind, cls, value) in inspect.classify_class_attrs(object):
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\inspect.py", line 443, in classify_class_attrs
    srch_obj = getattr(srch_cls, name, None)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\flask_sqlalchemy\model.py", line 30, in __get__
    return cls.query_class(
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\orm\query.py", line 273, in __init__
    self._set_entities(entities)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\orm\query.py", line 282, in _set_entities
    self._raw_columns = [
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\orm\query.py", line 283, in <listcomp>
    coercions.expect(
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\coercions.py", line 413, in expect
    resolved = impl._literal_coercion(
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\coercions.py", line 651, in _literal_coercion
    self._raise_for_expected(element, argname)
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\coercions.py", line 1139, in _raise_for_expected
    return super()._raise_for_expected(
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\coercions.py", line 710, in _raise_for_expected
    super()._raise_for_expected(
  File "C:\Users\Boco\AppData\Local\Programs\Python\Python38\lib\site-packages\sqlalchemy\sql\coercions.py", line 535, in _raise_for_expected
    raise exc.ArgumentError(msg, code=code) from err
sqlalchemy.exc.ArgumentError: Column expression, FROM clause, or other columns clause element expected, got <class 'sqlalchemy.orm.decl_api.Model'>.

我尝试重新安装flask和SQLAlchemy,并确保所有依赖项,比如psycopg2-binary,都已经安装好了。

1 个回答

0

看起来pydoc在处理带有数据库模型的Python文件时有个bug。我最后选择了使用pdoc,它生成文档没有任何问题。

pip install pdoc
pdoc objects.py

撰写回答