gpt4 book ai didi

python - 在 SQLAlchemy 模型字段上接受多种类型

转载 作者:行者123 更新时间:2023-12-01 08:50:29 25 4
gpt4 key购买 nike

考虑一个带有 String 字段的 SQLAlchemy 模型:

class MyModel(Base):
name = Column(String(100))
# ...

让该字段接受例如的正确方法是什么? int 值并在保存和查询之前将它们转换为字符串 - 本质上是 str(val)

最终我希望所有这些都是等效的:

m = MyModel(name='123')
m = MyModel(name=123)
q = session.query(MyModel).filter_by(name='123')
q = session.query(MyModel).filter_by(name=123)

最佳答案

我已经在 MySQL 上进行了测试,您的原始代码按原样工作:

class MyModel(Base):

__tablename__ = 'mymodel'

id = Column(Integer, primary_key=True)
name = Column("name", String(100))

if __name__ == '__main__':
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
s = Session()
new_obj = MyModel(name=123)
print(type(new_obj.name)) # <class 'int'>
s.add(new_obj)
s.commit()
s.close()

s = Session()
obj = s.query(MyModel).filter(MyModel.name == 123).one() # query with integer value
print(obj.name, type(obj.name)) # 123 <class 'str'>

This Answer ,与数据类型的验证和强制有关@zzzeek 说 sqlalchemy:

...defers to the DBAPI/database as the best and most efficient source of validation and coercion of values.

该答案还详细介绍了使用 SQLAlchemy Event 的一种方法。系统拦截在检测属性上设置的数据并执行操作。

另一种方法是使用 hybrid_property 装饰器和关联的 setter 在设置属性值时对其进行操作。它处理创建新对象和查询:

from sqlalchemy.ext.hybrid import hybrid_property

class MyModel(Base):

__tablename__ = 'mymodel'

id = Column(Integer, primary_key=True)
name_ = Column("name", String(100))

@hybrid_property
def name(self):
return self.name_

@name.setter
def name(self, val):
self.name_ = str(val)

if __name__ == '__main__':
Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)
s = Session()
new_obj = MyModel(name=123)
print(type(new_obj.name)) # <class 'str'>
s.add(new_obj)
s.commit()
s.close()

s = Session()
obj = s.query(MyModel).filter(MyModel.name == 123).one() # query with integer value
print(obj.name, type(obj.name)) # 123 <class 'str'>

所有这些方法都有详细记录,因此可以被认为是“正确的”。

关于python - 在 SQLAlchemy 模型字段上接受多种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53151204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com