>我定义了一个名为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设置的方法是以下方法之一:
- 在应用程序启动期间从设置/配置对象。
- 在请求期间,您可以从
request.registry.settings
传递设置。 - 在请求期间,您可以通过
pyramid.threadlocal.get_current_request()
访问活动请求,并从那里获取设置。
这听起来像您的架构需要更多思考。 即使实现了自定义列类型,该类型仍必须映射到引擎支持的 SQL 列类型中。 对于文件夹和文件名,这自然是两varchar
列。 那么,为什么不只使用两个字段,path
和 filename
,两者都是类中的 String(256)
类型呢?
至于可配置的根,这听起来像是您想指定相对于此根的path
,以便您只能在一个地方更改它。 将大部分配置放在数据库中,除了存储在配置文件中的一件事之外,对我来说是一种代码异味。 我认为最好将根作为其他配置表中的列,并使用ForeignKey
以这种方式引用根。