我的工作场所有一个私人托管的 PyPI 镜像,只能从特定的 IP 地址访问,可以通过 VPN 或在办公室轻松访问,因为它受到 IP 限制。这允许我们pip install使用我们使用的私有包。
要使用镜像,我已经--extra-index-url在里面指定了pip.conf,并且在运行VPN时,可以使用pip install得很好。
我希望能够在未连接到 VPN 的情况下使用pip install公开可用的软件包。然而,当我尝试从 PyPI 的公共镜像安装一个简单的公开可用的软件包时,pip 会尝试连接 5 次(每次重试超时 15 秒)到由于缺乏 VPN 而无法访问的私有镜像。错误如下图所示:
$ pip install requests
Collecting requests
Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ConnectTimeoutError(<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7f36c0bd25c0>, 'Connection to devpi.*REDACTED*.com timed out. (connect timeout=15)')'
由于我使用同一台机器用于工作和个人用途,因此在使用 pip 时我不应该始终连接到工作 VPN,因此这并不是一个真正的选择。我遇到了一种解决方法,即export PIP_CONFIG_FILE=/dev/null在运行之前在终端中运行pip install,但每次我想安装软件包时,这是一个繁琐的过程。
有没有办法让 pip 在尝试连接到无法访问的 URL 之前先在公共镜像中查找包?或者,是否有其他一些可能更干净的解决方法,例如减少重试次数或将超时时间设置为短于 15 秒?
考虑使用联接继承的以下SQLAlchemy映射:
from sqlalchemy import sa
class Location(Base):
id = Column(Integer, primary_key=True)
name = sa.Column(sa.String)
type_ = sa.column(sa.String)
__tablename__ = 'location'
__mapper_args__ = {
'polymorphic_identity': 'location',
'polymorphic_on': type_,
}
class Field(Location):
id = Column(Integer, primary_key=True)
size = sa.Column(sa.Float)
__tablename__ = 'field'
__mapper_args__ = {
'polymorphic_identity': 'field',
}
__table_args__ = (
sa.ForeignKeyConstraint(['id'], ['location.id']),
)
session.query(Field).filter(Field.size < 5).delete()
Run Code Online (Sandbox Code Playgroud)
其中base是适当的声明性基础,session是适当的会话对象.上面的实现将导致删除Field对象而不删除父Location对象(因为文档解释清楚,query.delete()不支持继承).我可以通过session.delete(obj)使用ORM删除链中的对象来解决这个问题.但是,这会导致在数据库上执行n个 SQL删除语句(其中n是要删除的对象数).我有一个案例,我可能一次删除100,000个子对象的顺序,所以这个操作非常慢(假设我现在不可能不使用带有连接继承的ORM - 我太深了改变这个).
是否有内SQLAlchemy的任何结构或一个合理的选择,这将允许我传递查询类型的对象查询对象Field并适当地删除了项目Location表以及未做ň SQL语句删除?
注意,我目前正在使用PostgreSQL,但是希望保持解决方案db-agnostic.
编辑:根据请求添加表元数据和有关环境的更多信息.
我偶尔会发现自己有一个表对象(例如由 检索Metadata.tables)并且想要获取 Mapper 对象,该对象定义了从某个用户定义的类到表的映射(然后最终是映射的类)
在上下文中,我有:
一个sqlalchemy.schema.Table对象;
一个sqlalchemy.schema.MetaData对象;
甲sqlalchemy.orm.session.Session表示当前会话对象。
我想要的是sqlalchemy.orm.mapper.Mapper定义用户定义的类和Table上面的对象之间的映射的对象。我找不到通过文档或检查这些对象及其可用方法来获取此信息的方法。有没有办法做到这一点?