SQLAlchemy列类型比较

时间:2016-01-14 10:55:57

标签: python sql sqlalchemy

我在不同的数据库类型中进行了大量的数据库内省,我希望能够比较两种列类型。例如,使用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 配置中强制列类型(通过避免特定于方言的转换)?

4 个答案:

答案 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