Python 如何拥有NDB数据存储的复合ID
在此之前,我拥有以下实体Python 如何拥有NDB数据存储的复合ID,python,google-app-engine,Python,Google App Engine,在此之前,我拥有以下实体 class User(ndb.Model): name = ndb.StringProperty(required = True) timestamp = ndb.DateTimeProperty(required = True) 我使用name作为id,通过以下方式编写代码 user = User.get_or_insert(name, name=name, timestamp=datetime.datetime.fromtimestamp
class User(ndb.Model):
name = ndb.StringProperty(required = True)
timestamp = ndb.DateTimeProperty(required = True)
我使用name
作为id,通过以下方式编写代码
user = User.get_or_insert(name, name=name,
timestamp=datetime.datetime.fromtimestamp(user_timestamp))
通过将名称
作为id,我可以使用名称
执行快速读取或更新
现在,我决定将我的实体更改为以下内容,并将
name
和type
作为复合id
class User(ndb.Model):
name = ndb.StringProperty(required = True)
type = ndb.StringProperty(required = True)
timestamp = ndb.DateTimeProperty(required = True)
转介后
我的第一个想法是,通过连接名称
和类型
,它实现了我的复合id目的
user = User.get_or_insert(name+type, name=name, type=type
timestamp=datetime.datetime.fromtimestamp(user_timestamp))
很快,我意识到这个想法是有缺陷的。由于以下情况会产生冲突
name type id
-------------------------
cheok paid cheokpaid
cheokp aid cheokpaid
2个不同的用户最终拥有相同的id
我想知道,什么是适合我的方法
名称
和类型
名称
和类型
为什么不在连接名称和类型时使用分隔符呢。然后,您的代码将按原样工作并解决您的问题 例如,如果使用“u”作为分隔符
cheok paid become cheok_paid and
cheokp aid become cheokp_aid
为什么不在连接名称和类型时使用分隔符呢。然后,您的代码将按原样工作并解决您的问题 例如,如果使用“u”作为分隔符
cheok paid become cheok_paid and
cheokp aid become cheokp_aid
{name中的字符数}{name+“{type
怎么样。您还可以在末尾连接。通过在“{}”处拆分,您可以得到名称末尾的索引。@GAEfan只是好奇,“名称中的字符数”与id=“{}{}{}}{{}”。format(len(name),name,type)
?OP提到了用户在name
中有尾随下划线或type
中有前导下划线的问题,因此,使下划线分隔符不可用(无法区分“name”+“+”type”
和“name”+“+”type”
。num\u字符让OP知道name
和type
之间的分隔符在哪里。为了可读性,我仍然添加了下划线分隔符。(我知道OP现在已经删除了这个反对意见。)那么{name}+name+“{”+type
呢。你也可以在末尾连接。通过在“}”处拆分,你可以得到名称末尾的索引。@GAEfan只是好奇,用id=“{}{}}}}格式(len(name),name,type)“name中的字符数”有什么意义
?OP提到用户在名称中有尾随下划线,或在类型中有前导下划线,从而使下划线分隔符不可用(无法区分“名称”+“类型”
和“名称”+“+”类型)
。num_字符让OP知道名称
和类型
之间的分隔位置。为了可读性,我仍然添加了下划线分隔符。(我发现OP现在已经删除了该异议。)