Python SQLAlchemy ORM___;init__;方法vs
在中,以下代码作为将映射到表的类的示例给出:Python SQLAlchemy ORM___;init__;方法vs,python,sqlalchemy,Python,Sqlalchemy,在中,以下代码作为将映射到表的类的示例给出: >>> from sqlalchemy import Column, Integer, String >>> class User(Base): ... __tablename__ = 'users' ... ... id = Column(Integer, primary_key=True) ... name = Column(String) ... fullname = Colu
>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
... __tablename__ = 'users'
...
... id = Column(Integer, primary_key=True)
... name = Column(String)
... fullname = Column(String)
... password = Column(String)
...
... def __init__(self, name, fullname, password):
... self.name = name
... self.fullname = fullname
... self.password = password
...
... def __repr__(self):
... return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
>来自sqlalchemy导入列,整数,字符串
>>>类用户(基本):
... __tablename_uu='users'
...
... id=列(整数,主键=True)
... 名称=列(字符串)
... fullname=列(字符串)
... 密码=列(字符串)
...
... 定义初始化(self、name、fullname、password):
... self.name=名称
... self.fullname=fullname
... self.password=密码
...
... 定义报告(自我):
... 返回“”%(self.name、self.fullname、self.password)
如果在实例化类时,用户在
\uuuu init\uuuuu
方法中设置了名称
、全名
和密码
,那么将它们声明为列
对象(即类变量)有什么意义?我不明白SQLAlchemy如何以及何时能够使用这些信息——它是否以某种方式通过用户继承的“基类”传递给SQLAlchemy模块?(我认为通过声明一个从另一个类继承的类,不可能以这种方式将信息传递给单元)。首先,您应该理解这一点
class Foo(object):
bar = ['baz']
及
意思非常不同,在第一种情况下,bar
是一个类属性,对于Foo
的所有实例都是相同的,类Foo
本身(它是type
的一个实例,不是Foo
),但是在第二种情况下,bar
是Foo
的每个实例的属性,并且与类完全没有关联!。如果您同时尝试这两种方法,并将其附加到栏
,对于第一种方法,更改将传播到Foo
的每个实例,但是对于第二种方法,只有您附加到的实例才会有该更改
您甚至可以同时设置这两个选项!,你可以做:
class Foo(object):
bar = 'baz'
def __init__(self):
self.bar = 'quux'
这是毫无疑问的Foo.bar=='baz'
,Foo().bar=='quox'
,您可以从具有type(Foo())的实例返回class属性。bar=='baz'
这意味着本教程中\uuuu init\uuu
中的参数适用于User
的实例,但列
定义适用于类
Sqlalchemy主要使用类信息。它使用它,以便能够生成SQL,该SQL以正确的方式从数据库进行读取和写入。这些定义仅适用于sqlalchemy将User
的实例转换为数据库调用,或从数据库接收行时尝试创建User
的实例的情况
您应该将类属性视为声明类型,将实例属性视为设置值
至于sqlalchemy何时实际使用该信息,在
Base
中有一种特殊的魔力,这几乎可以肯定来自sqlalchemy.ext.declarative.declarative\u Base()
。该函数返回一个类,该类使用一个元类,该元类可以跟踪从Base
派生的新类何时定义。在类定义的末尾,甚至在创建User
的实例之前,sqlalchemy就会查看User
类,以找到它需要知道的列属性。现在我更清楚了!最后一点,您将解释如何使用元类来跟踪从Base
派生的新类,这仍然非常令人困惑。你知道哪里有一个很好的解释来解释它是如何工作的吗?@MikeVella:你是在看一般元类的解释(如果有),还是特别是SQLAlchemy是如何使用元类的,请参见和。希望这些能有所帮助。如果您有更具体的问题,请随时开始新的问题。
class Foo(object):
bar = 'baz'
def __init__(self):
self.bar = 'quux'