我已经定义了一个名为File的新列类型,它应该让我只存储数据库中的文件名。然后我将实际文件存储在文件系统中的root +子文件夹+名称。
File(root, subfolder="", max_length=100, **kwargs)
我遇到的问题是我想在PasteDeploy配置文件中定义根。如何在运行时定义它以便我可以访问配置?
答案 0 :(得分:3)
为什么不避免自定义列类型的复杂性,只将文件路径存储为列,并提供一些可以为您加载文件数据的属性或混合属性?
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()
访问有效请求,然后您可以从中获取设置。 答案 1 :(得分:2)
对我而言,这听起来像你的架构需要更多的思考。即使您实现了自定义列类型,该类型仍然必须映射到引擎支持的SQL列类型。对于文件夹和文件名,这自然是两个varchar
列。那么为什么不在您的班级中使用path
和filename
两个字段?
对于可配置的根,这听起来像是要指定相对于此根的String(256)
,以便您只能在一个位置更改它。在数据库中拥有大部分配置,除了存储在配置文件中的一件事,对我来说就是代码味道。我认为将root作为其他配置表中的列是优选的,并使用path
来指向那个根。