我已经定义了一个名为File的新列类型,它应该让我只在数据库中存储文件名。然后我会将实际文件存储在文件系统的根目录+子文件夹+名称中。如何在运行时将变量传递给SQLAlchemy ORM定义?
File(root, subfolder="", max_length=100, **kwargs)
我遇到的问题是,我想在PasteDeploy配置文件中定义根。我如何在运行时定义这个,以便我可以访问配置?
我已经定义了一个名为File的新列类型,它应该让我只在数据库中存储文件名。然后我会将实际文件存储在文件系统的根目录+子文件夹+名称中。如何在运行时将变量传递给SQLAlchemy ORM定义?
File(root, subfolder="", max_length=100, **kwargs)
我遇到的问题是,我想在PasteDeploy配置文件中定义根。我如何在运行时定义这个,以便我可以访问配置?
对我来说这听起来像你的模式需要更多的思考。即使您实现了自定义列类型,该类型仍然必须映射到您的引擎支持的SQL列类型。对于文件夹和文件名,这是最自然的两列varchar
列。那么,为什么不使用两个字段,path
和filename
,这两个字段都是String(256)
在你的班级?
至于可配置的根,这听起来像你想指定path
相对于这个根,所以你可以只在一个地方改变它。除了配置文件中存储的一件事外,在数据库中拥有大部分配置对我来说都是一种代码异味。我认为最好是将根作为其他配置表中的一列,并使用ForeignKey
来指向那个根。
为什么不避免自定义列类型的复杂性,只是将文件路径存储为列,并提供一些可以为您加载文件数据的属性或混合属性?
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()
# ...
很明显,如果你愿意,你可以将一些功能包装到数据的方法上。
反正访问INI设置的方法是执行下列操作之一:在从设置/配置对象应用程序的启动
request.registry.settings
。pyramid.threadlocal.get_current_request()
访问活动请求,然后您可以从中获取设置。为我清除了一些东西,谢谢! – GhotiPhud
感谢您的解释,我找不出正确的方式来配置数据库模式。这将使金字塔部署之外的事情变得更加有用。 – GhotiPhud
在金字塔中,通常在INI文件中具有与部署相关的所有配置。这不是一种代码味道。想象一下,如果你想将生产环境复制到开发服务器中。首先,你做一个数据库的备份/恢复。接下来,您将复制存储所有文件的根文件夹。最后,使用数据库和根文件夹的位置修改dev INI文件。完成。无需SQL UPDATE。 – sayap