如何在不手动创建类/模型的情况下基于现有表生成类/模型。在我的情况下,仅在没有任何关系的平板上使用。 假设我的postgres数据库中有下表:
id | brand_name | cloth_type
1 nike t-shirt
2 adidas t-shirt
3 nike skirt
如何在不自己编写模型的情况下获得第一行的对象/实例(标识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
答案 0 :(得分: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)