当前位置: 首页 > 面试题库 >

如何验证SQLAlchemy ORM中的列数据类型?

蒋高超
2023-03-14
问题内容

使用SQLAlchemy ORM,我要确保值是其列的正确类型。

例如,假设我有一个Integer列。我尝试插入值“
hello”,它不是有效的整数。SQLAlchemy将允许我执行此操作。仅在稍后执行时session.commit(),它才会引发异常sqlalchemy.exc.DataError: (DataError) invalid input syntax integer: "hello"…

我要添加成批的记录add(…),出于性能原因,我不想在每笔记录之后提交。

那么我该如何:

  • 我尽快提出例外 session.add(…)
  • 或者,在将我添加的值添加到批处理 之前 ,确保将其转换为目标Column数据类型?
  • 或其他防止不良记录破坏整个记录的方法commit()

问题答案:

SQLAlchemy没有内置此功能,因为它符合DBAPI /数据库的要求,是最佳和最有效的验证和强制值来源。

为了构建自己的验证,通常使用TypeDecorator或ORM级验证。TypeDecorator的优点是它在核心运行,并且非常透明,尽管它仅在实际发出SQL时发生。

为了尽早进行验证和强制,这是在ORM级别上。

可以在ORM层通过@validates以下方式进行临时验证:

http://docs.sqlalchemy.org/en/latest/orm/mapped_attributes.html#simple-
validators

@validates使用的事件系统也可以直接使用。您可以编写一个通用的解决方案,将您选择的验证器链接到要映射的类型:

from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import event
import datetime

Base= declarative_base()

def validate_int(value):
    if isinstance(value, basestring):
        value = int(value)
    else:
        assert isinstance(value, int)
    return value

def validate_string(value):
    assert isinstance(value, basestring)
    return value

def validate_datetime(value):
    assert isinstance(value, datetime.datetime)
    return value

validators = {
    Integer:validate_int,
    String:validate_string,
    DateTime:validate_datetime,
}

# this event is called whenever an attribute
# on a class is instrumented
@event.listens_for(Base, 'attribute_instrument')
def configure_listener(class_, key, inst):
    if not hasattr(inst.property, 'columns'):
        return
    # this event is called whenever a "set" 
    # occurs on that instrumented attribute
    @event.listens_for(inst, "set", retval=True)
    def set_(instance, value, oldvalue, initiator):
        validator = validators.get(inst.property.columns[0].type.__class__)
        if validator:
            return validator(value)
        else:
            return value


class MyObject(Base):
    __tablename__ = 'mytable'

    id = Column(Integer, primary_key=True)
    svalue = Column(String)
    ivalue = Column(Integer)
    dvalue = Column(DateTime)


m = MyObject()
m.svalue = "ASdf"

m.ivalue = "45"

m.dvalue = "not a date"

验证和强制也可以使用TypeDecorator在类型级别上构建,尽管仅当发出SQL时才如此,例如本示例将utf-8字符串强制为unicode:

http://docs.sqlalchemy.org/zh_CN/latest/core/custom_types.html#coercing-
encoded-strings-to-
unicode



 类似资料:
  • 问题内容: Python 3.7是在不久前发布的,我想测试一些新奇的+键入功能。使用本机类型和模块中的本机类型,使提示正确工作非常容易。 但是我想尝试的另一件事是在运行时强制将类型提示作为条件,即类型不正确的a不可能存在。它可以很好地实现: 这种功能适用于本机类型和自定义类,但不适用于模块指定的功能: 有没有更好的方法来验证带有-typed列表的无类型列表?优选地,一个不包括检查类型的所有元素的任

  • 我有一个数据类(如下所示) 在下面给出的另一个函数中,我将其作为参数调用 如何直接在kotlin中检查请求是否不为null?

  • 我是新手,尝试使用json模式验证器版本4.3.0进行一些验证。运行时会出错。在这方面需要帮助。 这是我的模式(sample.json): 我的json响应是这样的: 编写的测试用例是: 我/我得到的错误是: 此外,我想知道是否有可能验证不同的数据类型,如字符,日期,数字?如果是的话,那也帮我一下。 提前感谢...

  • 是否可以使用自定义验证器将表单字段的输入与列表进行比较?我并不是试图比较两个表单控件。 我一直在尝试这种方法: 其中,在方法中,我将比较类别表单控件的值与可接受类别的列表。 然而,我在语法中迷失了方向,并在尝试用这种方法时出现了一些错误。有人有更好的方法将表单控件值与列表进行比较吗???

  • 我有一个电子邮件地址字段,其中有一个客户端验证,不允许几个临时域,如tempmailder.com或dispostable.com. 在服务器端,我使用了fluent验证来指定验证规则。 web中不允许的临时域。将文件配置为逗号分隔的字符串。 我是否可以指定一种方法来验证用户根据不允许的电子邮件域列表输入的值。 谢啦

  • 我从中向R导入数据的平台不支持指定数据类型,因此我的所有列都是。我有一个Excel文件,指定哪些列是,包括相关的和。现在,我正在尝试编写一个函数来动态更改数据中各个列的数据类型。框架 多亏了对这个问题的出色回答(dplyr-mutate:use dynamic variable names),我成功地编写了以下函数,在其中我动态地将列名设置为函数。 它起作用了,每次迭代都会返回整个数据帧,相关列(