postgresql 404页面未找到

quhf5bfb  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(3)|浏览(93)

我试图使用sqlacodegen与postgresql自动生成数据库模型从我的数据库,但它不断显示我这个导入错误

>sqlacodegen postgresql://postgres:j1234@localhost:4040/db1
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Scripts\sqlacodegen.exe\__main__.py", line 4, in <module>
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlacodegen\main.py", line 11, in <module>
    from sqlacodegen.codegen import CodeGenerator
  File "C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\site-packages\sqlacodegen\codegen.py", line 9, in <module>
    from inspect import ArgSpec
ImportError: cannot import name 'ArgSpec' from 'inspect' (C:\Users\user\AppData\Local\Programs\Python\Python311\Lib\inspect.py)

字符串
我正在使用python 3.11,postgresql,sqlalchemy 2.0.15和sqlacodegen 2.3.0
我想从我的数据库中为我的fastapi自动生成数据库模型。我也愿意接受任何类型的sqlacodegen替代方案

3zwjbxry

3zwjbxry1#

我也遇到了这个问题,因为Python 3.11中删除了ArgSpec。
解决方案是在文本编辑器中打开/site-packages/sqlacodegen/codegen.py文件。然后,删除第9行包含from inspect import ArgSpec的行。此外,删除第486和488行,将其替换为return False,然后再次运行命令。它应该可以正常工作。

mm5n2pyu

mm5n2pyu2#

为了补充其他人提到的问题,SQLAcodegen-v2没有这个问题,并且可以在Python 3.11(使用SQLAlchemy 2.0)上运行良好。

p4rjhz4m

p4rjhz4m3#

目前,sqlacodegen与3.11不兼容。因此,作为一种变通方法(就像@yusufusta建议的那样)

  • venv/Lib/site-packages/sqlacodegen/codegen.py
  • 删除ArgSpec
  • 通过这些更改以下函数:
def _getargspec_init(method):
        try:
            if hasattr(inspect, 'getfullargspec'):
                fullargspec = inspect.getfullargspec(method)
                return {
                    'args': fullargspec.args,
                    'varargs': fullargspec.varargs,
                    'varkw': fullargspec.varkw,
                    'defaults': fullargspec.defaults
                }
            else:
                argspec = inspect.getargspec(method)
                return {
                    'args': argspec.args,
                    'varargs': argspec.varargs,
                    'varkw': argspec.varkw,
                    'defaults': argspec.defaults
                }
        except TypeError:
            if method is object.__init__:
                return {
                    'args': ['self'],
                    'varargs': None,
                    'varkw': None,
                    'defaults': None
                }
            else:
                return {
                    'args': ['self'],
                    'varargs': 'args',
                    'varkw': 'kwargs',
                    'defaults': None
                }

    @classmethod
    def render_column_type(cls, coltype):
        args = []
        kwargs = OrderedDict()
        argspec = cls._getargspec_init(coltype.__class__.__init__)
        defaults = dict(zip(argspec['args'][-len(argspec['defaults'] or ()):],
                            argspec['defaults'] or ()))
        missing = object()
        use_kwargs = False
        for attr in argspec['args'][1:]:
            # Remove annoyances like _warn_on_bytestring
            if attr.startswith('_'):
                continue

            value = getattr(coltype, attr, missing)
            default = defaults.get(attr, missing)
            if value is missing or value == default:
                use_kwargs = True
            elif use_kwargs:
                kwargs[attr] = repr(value)
            else:
                args.append(repr(value))

        if argspec['varargs'] and hasattr(coltype, argspec['varargs']):
            varargs_repr = [repr(arg) for arg in getattr(coltype, argspec['varargs'])]
            args.extend(varargs_repr)

        if isinstance(coltype, Enum) and coltype.name is not None:
            kwargs['name'] = repr(coltype.name)

        for key, value in kwargs.items():
            args.append('{}={}'.format(key, value))

        rendered = coltype.__class__.__name__
        if args:
            rendered += '({0})'.format(', '.join(args))

        return rendered

字符串

相关问题