2012-09-01 34 views
1

我已经定义了一个名为File的新列类型,它应该让我只在数据库中存储文件名。然后我会将实际文件存储在文件系统的根目录+子文件夹+名称中。如何在运行时将变量传递给SQLAlchemy ORM定义?

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

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

回答

2

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

至于可配置的根,这听起来像你想指定path相对于这个根,所以你可以只在一个地方改变它。除了配置文件中存储的一件事外,在数据库中拥有大部分配置对我来说都是一种代码异味。我认为最好是将根作为其他配置表中的一列,并使用ForeignKey来指向那个根。

+0

感谢您的解释,我找不出正确的方式来配置数据库模式。这将使金字塔部署之外的事情变得更加有用。 – GhotiPhud

+0

在金字塔中,通常在INI文件中具有与部署相关的所有配置。这不是一种代码味道。想象一下,如果你想将生产环境复制到开发服务器中。首先,你做一个数据库的备份/恢复。接下来,您将复制存储所有文件的根文件夹。最后,使用数据库和根文件夹的位置修改dev INI文件。完成。无需SQL UPDATE。 – sayap

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() 
    # ... 

很明显,如果你愿意,你可以将一些功能包装到数据的方法上。

反正访问INI设置的方法是执行下列操作之一:在从设置/配置对象应用程序的启动

  1. 请求期间,您可以通过设置从request.registry.settings
  2. 在请求期间,您可以通过pyramid.threadlocal.get_current_request()访问活动请求,然后您可以从中获取设置。
+0

为我清除了一些东西,谢谢! – GhotiPhud