attr就是从Model访问的名称, name是数据库中的列名, key是从Table对象访问的名称
从table说起
一般来说我们会这样定义一个Model:
1 2 3 4 5 6 7 8
| Base = declarative_base()
class Customer(Base): __tablename__ = 'Customers' Id = Column("id_col", Integer, primary_key=True, key="abcde") Name = Column(String(255))
|
注意,当我们定义一个Customer,然后有一个列叫Id, name叫id_col, key叫"abcde"的时候,这堆东西都意味着什么呢?
首先,declarative_base的作用本质是语法糖,它等价于:
1 2 3 4 5 6 7 8 9 10 11
| metadata = MetaData()
customer = Table('Customers', metadata, Column("id_col", Integer, primary_key=True, key="abcde"), Column("Name", String(255)) )
class Customer(object): pass
mapper(Customer, customer) # this will modify the Customer class!
|
实际上,sqlalchemy中使用的都是Table类.
例如上述代码创建的model:
1 2
| >>> Customer.__table__ Table('Customers', MetaData(), Column('id_col', Integer(), table=<Customers>, key='abcde', primary_key=True, nullable=False), Column('Name', String(length=255), table=<Customers>), schema=None)
|
attr 与 name 与 key
attr就是从Model访问的名称, name是数据库中的列名, key是从Table对象访问的名称:
测试name是列名:
1 2
| stmt = select(Customer) print(str(stmt.compile(engine)))
|
1 2 3
| SELECT "Customers".id_col, "Customers"."Name" FROM "Customers"
|
测试key是从Table对象访问的名称:
1 2
| >>> Customer.__table__.c.abcde Column('id_col', Integer(), table=<Customers>, key='abcde', primary_key=True, nullable=False)
|