JohnLyu的blog

橙汁事务所艾欧泽亚分部

0%

sqlalchemy中column的name和key的区别

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)