Документация для type_
arg to Column
указывает:
Если типом является None или он опущен, он по умолчанию будет
специальный тип NullType. Если и когда эта колонка сделана для ссылки на
другой столбец, использующий ForeignKey и / или ForeignKeyConstraint, тип
столбца с удаленной ссылкой будет скопирован в этот столбец,
в тот момент, когда внешний ключ разрешен в отношении этого удаленного
Объект столбца.
Когда родительский столбец ForeignKey
присоединен к его таблице, вызывается метод ForeignKey._set_table()
, и в этом методе FK разрешает столбец внешней таблицы, на которую он ссылается. В этот момент, если родительский столбец FK не имеет типа, он устанавливает его из внешнего столбца. Это происходит здесь в ForeignKey._set_target_column()
:
# propagate TypeEngine to parent if it didn't have one
if self.parent.type._isnull:
self.parent.type = column.type
Интересно, что в самом первом примере определения таблиц в учебник по языку выражений :
>>> from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
>>> metadata = MetaData()
>>> users = Table('users', metadata,
... Column('id', Integer, primary_key=True),
... Column('name', String),
... Column('fullname', String),
... )
>>> addresses = Table('addresses', metadata,
... Column('id', Integer, primary_key=True),
... Column('user_id', None, ForeignKey('users.id')),
... Column('email_address', String, nullable=False)
... )
... столбец addresses.user_id
имеет свой тип, явно установленный на None
, чтобы использовать эту функцию, однако, кажется, нет никакого объяснения этому, пока ссылка на API для Column
.