【问题标题】:PyCharm SQLAlchemy autocompletePyCharm SQLAlchemy 自动完成
【发布时间】:2014-03-14 15:41:57
【问题描述】:

我开始评估 PyCharm 3 专业版,因为我将从事几个 Pyramid + SQLAlchemy 项目。 我真的很想拥有的一件事是 SQLAlchemy 自动完成。

我按照these 的说明使用炼金术脚手架创建了一个新的入门项目。我还为我在这个项目中使用的解释器和虚拟环境安装了 SQLAlchemy 包。

另外,当我为此代码创建一个新的 pycharm 项目时,IDE 建议我安装金字塔、sqlalchemy 和其他包。我当然接受了这个建议,让 IDE 安装所有这些包。

models.py文件中,DBSession声明如下:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

在views.py文件中,DBSession是这样使用的:

one = DBSession.query(MyModel).filter(MyModel.name == 'one').first()

所以我开始使用 IDE 并做了这样的事情:键入 DBSession。 IDE只是给了我一些建议,其中没有列出“查询”功能。然后我尝试输入:DBSession.query(MyModel)。并按Ctrl+Space 尝试获取建议并显示“无建议”消息。

我真的很想获得可以在我的 DBSession 变量上使用的函数的 SQLAlchemy 建议(如 filterfilter_byfirst 等)。我会说这对我来说是强制性的:)

我有什么遗漏吗?或者,PyCharm 不支持这个?

【问题讨论】:

  • 您使用的是虚拟环境吗?
  • 是的,我使用的是虚拟环境,但我意识到这可能与 PyCharm 无关,因为它可能无法推断出某个变量在编辑器中属于某种类型。所以我必须学会在没有自动完成的情况下生活。
  • 转到 File > Settings > Python Interpreter 并确保选择了安装 SQLAlchemy 的虚拟环境。有时它会选择错误的解释器,你会失去自动完成支持。
  • @IanAuld,我检查了一下,virtualenv 被选为项目的 python 解释器。虚拟环境是否必须在同一台计算机上的虚拟机中?

标签: python sqlalchemy pyramid pycharm


【解决方案1】:

我找到的解决方案(从网络上的某处获取)是输入提示 DBSession 实例,如下所示:

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
""":type: sqlalchemy.orm.Session"""

在此之后,代码完成似乎在项目中的任何地方都可以正常工作

【讨论】:

  • 非常感谢!你摇滚!解决了我的问题!!编码时喝了太多咖啡!再次感谢!
【解决方案2】:

请注意,教程指出:

本指南是为 PyCharm 2.7.3 编写的,尽管许多主题适用于 PyCharm 3。

在 PyCharm 3 Professional 中,安装 Pyramid 并开始使用脚手架要容易得多。具体看我的视频教程之一Pyramid in PyCharm in 5 minutes 1:17。

此外,如果某些东西没有按预期工作,您可能想放弃您的项目并重新开始。

PyCharm 3 Professional supports SQAlchemy 如下。

  • 代码洞察 (2.6+)
  • 可以在图表中查看数据库结构。请参阅使用图表部分。
  • 代码完成和解析。 (3.0+)

查看更多关于如何使用code completion的信息。

【讨论】:

  • 谢谢史蒂夫。你的视频很有帮助!不幸的是,我重新开始并使用“alchemy”脚手架创建了一个新的 Pyramid 项目,但我仍然无法获得 DBSession sqlalchemy 对象的任何代码完成(还再次查看了“代码完成”信息)。仍在与此作斗争,并试图弄清楚如何在 30 天试用期结束之前获得 sqlalchemy 自动完成功能。非常感谢任何其他建议。
  • 谢谢!在我看来,PyCharm 社区版不像专业版那样支持自动完成
【解决方案3】:

我在变量赋值后使用类型声明:

from sqlalchemy import create_engine
from sqlalchemy.engine import Engine

...

engine = create_engine(connect_str, max_overflow=10)
engine: Engine

作为for循环中变量的使用,我使用了:

for table, meta in tables.items():
    meta: Table
    pass

其中,tablessqlalchemy.orm.mapper.Mappertable 为导入类型:

from sqlalchemy import create_engine, Table

【讨论】:

    【解决方案4】:

    如果有人现在来到这里,可以找到我所见过的针对此问题的最佳解决方案 here。为您节省点击次数:

    from contextlib import contextmanager
    from typing import ContextManager
    
    @contextmanager
    def session() -> ContextManager[Session]:
        yield Session(...)
    

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2012-09-13
      • 2018-08-27
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      相关资源
      最近更新 更多