【问题标题】:Auto generate Class/Model based on pre existing table [duplicate]根据预先存在的表自动生成类/模型[重复]
【发布时间】:2019-10-14 06:46:01
【问题描述】:

如何在不手动创建类/模型的情况下基于预先存在的表生成类/模型。在我的情况下,这仅用于没有任何关系的平面表。 假设我的 postgres 数据库中有下表:

id  |  brand_name  |  cloth_type
1      nike           t-shirt
2      adidas         t-shirt
3      nike           skirt

如何在不自己编写模型的情况下获取第一行(id 1)的对象/实例? 有没有办法创建一个动态生成的抽象类或根据表添加属性的地方?

我找到了这个,但无法真正掌握如何实现它。 https://docs.sqlalchemy.org/en/13/orm/extensions/automap.html

我想要实现的可能看起来像这样(粗略的代码)

engine = db_connect(db_config_section)  # creates engine based on config 
file
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
abstract_class = ...  # somehow generate abstract class
obj = session.query(abstract_class).get(1)

感谢您的回复。

编辑: 在链接的解决方案中,仍然有一个使用固定类名和表名定义的类。那不是我要寻找的。 我想要的代码应该独立于一张表。例如,适用于布表(如我的示例)的代码也应该适用于以下表(汽车):

   id  |  brand_name  |  car_type | doors
    1      bmw           suv        4
    2      ford          pickup     2
    3      fiat          cuv        2

【问题讨论】:

  • 如果您对根据现有表生成模型感兴趣,请查看stackoverflow.com/questions/1425412/…
  • @IljaEverilä 感谢您的提示,但不幸的是,这并不能解决我的问题。
  • @IljaEverilä 是的,但它并没有解决我的问题,因为它似乎是针对不同的情况,即使它有点相似。据我了解,此解决方案仍然依赖于编写您自己的模型/类。 MyClass 模型仍然是固定的,仅用于在 Tabel() 调用中声明的一个表。因此,您必须为数据库中的每个表编写这样的模型。那是我不想要的。有没有更抽象的解决方案?例如。使用 type 函数根据表生成一个类,然后使用 sqlalchemy 检索实例?
  • 这就是链接答案的作用,使用自动映射扩展。它在运行时为您生成模型类。你不会编写类代码。

标签: python sqlalchemy


【解决方案1】:

好的,我解决了。正如 IljaEverilä 悲伤的那样,解决方案主要由他链接的 stackoverflow 帖子给出。我不得不稍微调整一下。我理解的有点慢,抱歉。 这是我的解决方案:

def create_class_by_table(table_name, engine):
      table = Table(table_name, Base.metadata, autoload=True, autoload_with=engine)
      class_name = table_name.capitalize()
      attributes = {'__table__': table}
      new_class = type(class_name, (Base,), attributes)
      return new_class

new_class = create_class_by_table(table_name, engine)  # table_name could be e.g. 'car'
obj = session.query(new_class).get(obj_id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多