当值为"无"时,用默认值填充字段



我遇到字段问题,这些字段可能有None(或null(值。不管我如何定义字段,Pony要么画一个错误,要么只写空值。

尝试1(使用db.set_sql_debug(True)运行时输出(:

# phone = orm.Required(str, default='not available')
#
CREATE TABLE `contacts` (
`uid` VARCHAR(13) PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`phone` VARCHAR(255) NOT NULL,
`archived` BOOLEAN
)

结果:ValueError: Attribute Contacts.phone is required

尝试2:

# phone = orm.Optional(str, default='not available')
#
CREATE TABLE `contacts` (
`uid` VARCHAR(13) PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`phone` VARCHAR(255) NOT NULL,
`archived` BOOLEAN
)

第二次尝试的结果:ValueError: Attribute Contacts.phone cannot be set to None

尝试3:Try#3会起作用,但数据库中的null值实际上是null值,而不是文档中的空字符串:

# phone = orm.Optional(str, nullable=True, default='not available')
#
CREATE TABLE `edis_itmap_tbl_contacts` (
`uid` VARCHAR(13) PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`phone` VARCHAR(255),
`archived` BOOLEAN
)
电子邮件存档
uid名称电话
39VSPJVSS2Z42某些名称some@email.com0

下面是pony中的Required类,如果仔细查看validate方法中的第3行,您会发现pony检查是否为字段设置了sql_default属性,而不是default属性。

有关更多详细信息,您可以阅读有关default属性及其行为的文档。

class Required(Attribute):
__slots__ = []
def validate(attr, val, obj=None, entity=None, from_db=False):
val = Attribute.validate(attr, val, obj, entity, from_db)
if val == '' or (val is None and not (attr.auto or attr.is_volatile or attr.sql_default)):
if not from_db:
throw(ValueError, 'Attribute %s is required' % (
attr if obj is None or obj._status_ is None else '%r.%s' % (obj, attr.name)))
else:
warnings.warn('Database contains %s for required attribute %s'
% ('NULL' if val is None else 'empty string', attr),
DatabaseContainsIncorrectEmptyValue)
return val

最新更新