1

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

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

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

4

2 回答 2

4

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

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. 在请求期间,您可以将设置传入 from request.registry.settings
  3. 在请求期间,您可以通过并从那里访问活动请求pyramid.threadlocal.get_current_request(),您可以获取设置。
于 2012-09-01T03:05:49.807 回答
3

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

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

于 2012-09-01T03:22:23.457 回答