如何在运行时将变量传递给SQLAlchemy ORM定义?

时间:2012-09-01 01:34:58

标签: python sqlalchemy pyramid paster

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

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

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

2 个答案:

答案 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设置的方法之一是:

  1. 在应用程序启动期间从settings / config对象。
  2. 在请求期间,您可以从request.registry.settings传递设置。
  3. 在请求期间,您可以通过pyramid.threadlocal.get_current_request()访问有效请求,然后您可以从中获取设置。

答案 1 :(得分:2)

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

对于可配置的根,这听起来像是要指定相对于此根的String(256),以便您只能在一个位置更改它。在数据库中拥有大部分配置,除了存储在配置文件中的一件事,对我来说就是代码味道。我认为将root作为其他配置表中的列是优选的,并使用path来指向那个根。