我在不同的数据库类型中进行了大量的数据库内省,我希望能够比较两种列类型。例如,使用Boolean
定义为declarative_base()
类型的字段会转换为 MySQL dialact的特定TINYINT
,因此请执行以下检查:< / p>
model_a.__table__.columns['col'].type == model_b.__table__.columns['col'].type
不起作用,也不是这个:
(type_a == type_b) or issubclass(type_b, type_a)
如何比较两列数据类型&#34;亲和力&#34;? (通过检查代码,我看到列类型附加了Comparator
类,但我不确定它是否可以提供任何帮助以及如何使用它
也可以在 SQLAlchemy 配置中强制列类型(通过避免特定于方言的转换)?
答案 0 :(得分:2)
(回答一个老问题,因为我一直在研究这个问题。)
最快的解决方案是比较类型的str():
assert str(type_a) == (type_b)
这适用于简单类型,但如果你有任何Variant
类型或包装(例如,MutableDict
包装Postgres JSON
)那么你将需要处理一个特殊的情况下。
答案 1 :(得分:0)
例如检查类型是否为BLOB。使用此代码:
import sqlalchemy as db
some code..
if type(column.type) is db.types.BLOB:
something..
答案 2 :(得分:0)
在2019年寻找相同答案时发现了这个话题-如果有人出现,这就是对我有用的东西。
要检查表'col'
和model_a
中存在的列model_b
上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
子句(即“ A a B?” 和“ B a A?”)来拒绝任何一个表都具有子类化列类型的情况而不是相同的类型。
但是,如果您的类型不必严格相等并且子类是可接受的,则可以删除isinstance
子句中的一个或另一个。
答案 3 :(得分:0)
不确定这是否适用于您的特定用例,但您可以使用 column.type.python_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