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