Python ORM模型定义如何将列属性绑定到实际列?

Python ORM模型定义如何将列属性绑定到实际列?,python,Python,我试图理解ORMs如何能够通过class属性解析表列,而不显式地提供表名和列名 from orm import Column class Car(Model): id = Column() 然后,查询可以执行以下操作: Car.select().where(Car.id == 7) 我知道Column为\uuuu eq\uuuu操作符定义了一个方法,但是Column实例如何知道它引用的是classCar和attributeid(假设默认情况下它们用于表名和列名) 通过深入研究ORM

我试图理解ORMs如何能够通过class属性解析表列,而不显式地提供表名和列名

from orm import Column

class Car(Model):
    id = Column()
然后,查询可以执行以下操作:

Car.select().where(Car.id == 7)
我知道Column为
\uuuu eq\uuuu
操作符定义了一个方法,但是Column实例如何知道它引用的是class
Car
和attribute
id
(假设默认情况下它们用于表名和列名)


通过深入研究ORM LIB的工作原理,我学到了很多关于python的知识

在SqlAlchemy和DJango ORM中,基类(
Model
此处)与执行内省的元类或工厂方法(如
\uuuuu new\uuuu
)相关联

以下是如何使用函数进行复制(更简单的解决方案):

如果cls类为空或
None
,则此
setup\u class
函数将对cls类进行内省,并设置name属性,例如:

class Car(Model):
    id = Column()


from pprint import pprint
pprint(Car.id.name)
# -> None

setup_class(Car)
pprint(Car.id.name)
# -> 'id'
编辑

使用元类的实现示例:

class Column():
    def __init__(self, name=None):
        self.name = name


class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        for name, col in attrs.items():
            if isinstance(col, Column):
                col.name = col.name or name
        return super(MyMeta, cls).__new__(cls, name, bases, attrs)


class Model(metaclass=MyMeta):
    pass


class Car(Model):
    id = Column()


import pprint
pprint.pprint(Car.id.name)
# -> 'id'

当然,这还不够。您必须了解
是一个完整的列表。此描述符用于构建SQL查询

我知道我错过了一些魔法。以前从未遇到过元类。谢谢Laurent!
class Column():
    def __init__(self, name=None):
        self.name = name


class MyMeta(type):
    def __new__(cls, name, bases, attrs):
        for name, col in attrs.items():
            if isinstance(col, Column):
                col.name = col.name or name
        return super(MyMeta, cls).__new__(cls, name, bases, attrs)


class Model(metaclass=MyMeta):
    pass


class Car(Model):
    id = Column()


import pprint
pprint.pprint(Car.id.name)
# -> 'id'