【问题标题】:SQLAlchemy - Models - using dynamic fields - ActiveRecordSQLAlchemy - 模型 - 使用动态字段 - ActiveRecord
【发布时间】:2010-11-12 23:51:58
【问题描述】:

我可以在 SQLAlchemy 中定义一个模型,例如:

class Person(Base):  
    pass

只是让它动态地获取字段名称?无论如何要获得命名约定来控制表之间的关系?我想我正在寻找类似于 RoR 的 ActiveRecord 但在 Python 中的东西。

不确定这是否重要,但我会尝试在 IronPython 而不是 cPython 下使用它。

【问题讨论】:

    标签: python activerecord ironpython sqlalchemy


    【解决方案1】:

    自动拾取字段名非常简单:

    from sqlalchemy import Table
    from sqlalchemy.orm import MetaData, mapper
    
    metadata = MetaData()
    metadata.bind = engine
    
    person_table = Table(metadata, "tablename", autoload=True)
    
    class Person(object):
        pass
    
    mapper(Person, person_table)
    

    使用这种方法,您必须在对mapper() 的调用中定义关系,因此不会自动发现关系。

    要将类自动映射到同名的表,您可以这样做:

    def map_class(class_):
        table = Table(metadata, class_.__name__, autoload=True)
        mapper(class_, table)
    
    map_class(Person)
    map_class(Order)
    

    Elixir 可以做任何你想做的事情。

    【讨论】:

    • +1。支持基于命名约定的自动关系怎么样?与示例的良好链接?谢谢codeape
    • 我认为这不适用于关系。这些必须在映射器中手动定义。
    • autoload=True 从数据库方案创建数据库元数据,并自动创建简单数据字段的映射,但您仍然需要手动定义关系,因为有些事情无法猜到第一行数据库布局中的多对多或一对一。
    • 不,这不适用于关系。但是看看Elixir。我认为它可以满足您的需求。
    【解决方案2】:

    AFAIK sqlalchemy 有意解耦数据库元数据和类布局。

    您可能应该研究 Elixir (http://elixir.ematia.de/trac/wiki):sqlalchemy 的活动记录模式,但您必须定义类,而不是数据库表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2010-09-20
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      相关资源
      最近更新 更多