Python SQLAlchemy列类型比较

Python SQLAlchemy列类型比较,python,sql,sqlalchemy,Python,Sql,Sqlalchemy,我正在对不同的数据库类型进行大量的数据库自省,我希望能够比较两种列类型。例如,使用declarative_base()定义为Boolean类型的字段被转换为MySQLdialact的特定TINYINT,因此如下检查: model_a.__table__.columns['col'].type == model_b.__table__.columns['col'].type 不起作用,这个也不行: (type_a == type_b) or issubclass(type_b, type_a)

我正在对不同的数据库类型进行大量的数据库自省,我希望能够比较两种列类型。例如,使用
declarative_base()
定义为
Boolean
类型的字段被转换为MySQLdialact的特定
TINYINT
,因此如下检查:

model_a.__table__.columns['col'].type == model_b.__table__.columns['col'].type
不起作用,这个也不行:

(type_a == type_b) or issubclass(type_b, type_a)
如何比较数据类型“affinity”的两列?(通过检查代码,我看到列类型附带了一个
Comparator
类,但我不确定它是否有帮助以及如何使用它) 也可以在SQLAlchemy配置中强制使用列类型(通过避免特定于方言的转换)?

(回答一个老问题,因为我一直在研究这个问题)

最快的解决方案是比较以下类型的str()

assert str(类型a)==(类型b)


这适用于简单类型,但如果您有任何
Variant
类型或包装器(例如,
MutableDict
wrapping Postgres
JSON
),则必须处理特殊情况。例如,检查类型是否为BLOB。使用此代码:

import sqlalchemy as db
some code..
if type(column.type) is db.types.BLOB:
    something..

在2019年搜索相同答案时发现了这条线索——如果有其他人出现,这是对我有效的方法

要检查表
model_a
model_b
中列
'col'
上SQLAlchemy类型的严格类型相等性,请使用:

isinstance(model_a.columns['col'].type, type(model_b.columns['col'].type)) and
isinstance(model_b.columns['col'].type, type(model_a.columns['col'].type))
您需要同时使用
isinstance
子句(即“Is A B?”和“Is B A A?”)来拒绝任何一个表具有子类列类型而不是相同类型的情况


但是,如果您的类型不需要严格相等,并且子类是可以接受的,您可以删除一个或另一个
isinstance
子句。

不确定这是否适用于您的特定用例,但是您可以使用
column.type.Python\u type
根据各自的Python类型比较列类型

示例ORM模型

class Example(Base)
    exCol1 = Column(String)
    exCol2 = Column(String)
    exCol3 = Column(Integer)
比较列类型:

In [1]: Example.__table__.columns['exCol1'].type.python_type == Example.__table__.columns['exCol2'].type.python_type
Out[1]: True
In [2]: Example.__table__.columns['exCol1'].type.python_type == Example.__table__.columns['exCol3'].type.python_type
Out[2]: False

谢谢你,本!:)