Python 炼金术中的验证

Python 炼金术中的验证,python,sqlalchemy,pyramid,Python,Sqlalchemy,Pyramid,如何在SQLAlchemy中获得所需的验证器?实际上,我只是想确信用户在表单中填写了所有必填字段。我使用PostgreSQL,但没有意义,因为从models.py文件中的对象创建的表: from sqlalchemy import ( Column, Integer, Text, DateTime, ) from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.or

如何在SQLAlchemy中获得所需的验证器?实际上,我只是想确信用户在表单中填写了所有必填字段。我使用PostgreSQL,但没有意义,因为从models.py文件中的对象创建的表:

 from sqlalchemy import (
    Column,
    Integer,
    Text,
    DateTime,
    )

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    )

from zope.sqlalchemy import ZopeTransactionExtension

from pyramid.security import (
    Allow,
    Everyone,
    )

Base = declarative_base()


class Article(Base):
    """ The SQLAlchemy declarative model class for a Article object. """
    __tablename__ = 'article'

    id = Column(Integer, primary_key=True)
    name = Column(Text, nullable=False, unique=True)
    url = Column(Text, nullable=False, unique=True)
    title = Column(Text)
    preview = Column(Text)
    content = Column(Text)
    cat_id = Column(Integer, nullable=False)
    views = Column(Integer)
    popular = Column(Integer)
    created = Column(DateTime)

    def __unicode__(self):
        return unicode(self.name)

因此,这个
nullable=False
不起作用,因为在任何情况下添加的记录都带有空字段。例如,我当然可以通过将set name设置为notnull来设置数据库级别的限制。但是SQLAlchemy中肯定有一些关于验证的东西,不是吗?我来自yii php框架,这里根本没有问题。

关于空字段,我猜您指的是空字符串,而不是空字符串。A是添加验证,例如:

class Article(Base):
    ...
    name = Column(Text, unique=True)
    ...

    @validates('name')
    def validate_name(self, key, value):
        assert value != ''
        return value
要在数据库级别实现它,还可以使用,只要数据库支持:

class Article(Base):
    ...
    name = Column(Text, CheckConstraint('name!=""')
    ...

谢谢你,伙计。它工作得很好。但实际上我不知道如何识别views.py中哪个验证器被激活了?我只能捕获AssertionError,但没有关于哪个字段错误的信息。因此,要么引发自定义异常,要么添加错误消息,例如,
AssertName!='''名称不能为空“
如果名称==”;raise NyNameError
需要记住的一件重要事情是,验证decorator函数仅在设置属性时验证属性。如果您创建了一篇文章,并且没有在代码中设置名称,那么验证函数将永远不会被触发,它将在名称属性没有值的情况下将记录插入数据库。不要使用
断言值!=''-O
选项运行
python
会删除
assert
语句。请记住,SQLAlchemy并非设计为验证框架:相反,它是一个数据库工具包,还可以用作ORM。类似于
nullable
参数可以帮助您获取SQLAlchemy以生成SQL创建脚本(将列设置为
notnull
)。因此,SQLAlchemy的设计目的是将验证问题留给您(如下所述使用
验证
)、数据库本身(如使用
检查约束
)或其他软件(如)。