it kind of seems like this is very nearly re-implementing get_or_create with the exact same semantics:
if None, create then return
if One, return
if More than one, throw error.

granted get_or_create is also not thread safe, but this is somewhat not DRY =)