我遇到字段问题,这些字段可能有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.com | 空 | 0 |
下面是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