如何在运行时将变量传递给SQLAlchemy ORM定义



>我定义了一个名为File的新列类型,它应该只允许我将文件名存储在数据库中。 然后我会将实际文件存储在文件系统中的根+子文件夹+名称中。

File(root, subfolder="", max_length=100,  **kwargs)

我遇到的问题是我想在 PasteDeploy 配置文件中定义根。 如何在运行时定义它以便访问配置?

为什么不避免自定义列类型的复杂性,而只是将文件路径存储为列,并提供一些可以为您加载文件数据的属性或混合属性?

class Data(Base):
    path = Column(String)
def myview(request):
    data = Data(path='foo')
    root_path = request.registry.settings['data_root']
    with open(os.path.join(root_path, data.path), 'rb') as fp:
        file_data = fp.read()
    # ...

显然,如果需要,您可以将其中一些功能包装到 Data 上的方法中。

无论如何,访问INI设置的方法是以下方法之一:

  1. 在应用程序启动期间从设置/配置对象。
  2. 在请求期间,您可以从 request.registry.settings 传递设置。
  3. 在请求期间,您可以通过pyramid.threadlocal.get_current_request()访问活动请求,并从那里获取设置。
对我来说,

这听起来像您的架构需要更多思考。 即使实现了自定义列类型,该类型仍必须映射到引擎支持的 SQL 列类型中。 对于文件夹和文件名,这自然是两varchar列。 那么,为什么不只使用两个字段,pathfilename ,两者都是类中的 String(256) 类型呢?

至于可配置的根,这听起来像是您想指定相对于此根的path,以便您只能在一个地方更改它。 将大部分配置放在数据库中,除了存储在配置文件中的一件事之外,对我来说是一种代码异味。 我认为最好将根作为其他配置表中的列,并使用ForeignKey以这种方式引用根。

相关内容

  • 没有找到相关文章

最新更新