SQLAlchemy: 随机唯一整数?

5

我可以这样设置列类型为唯一字符串:

    uuid = Column(String,  default=lambda: str(uuid.uuid4()), unique=True)

但我想生成随机唯一整数,而不是随机唯一字符串。

有什么办法可以做到这一点吗?


uuid.uuid4().int

谢谢。如果我可以重新说明 :) 是否有一种方法可以将其适应于数据库整数类型。


2
访问其int属性:uuid.uuid4().int,如文档所述。 - sascha
或者只需使用序列,这将为您提供唯一的整数,它们恰好是有序的,但谁又能说它们不是随机生成的,而你只是幸运的呢? - larsks
1
@larsks 尝试向一些安全顾问解释您的代码时,这可能有些困难 :-) - sascha
2个回答

5
from random import randint 

def random_integer():
    min_ = 100
    max_ = 1000000000
    rand = randint(min_, max_)

    # possibility of same random number is very low.
    # but if you want to make sure, here you can check id exists in database.
    from sqlalchemy.orm import sessionmaker
    db_session_maker = sessionmaker(bind=your_db_engine)
    db_session = db_session_maker()
    while db_session.query(Table).filter(uuid == rand).limit(1).first() is not None:
        rand = randint(min_, max_)

    return rand

class Table(Base):
    uuid = Column(String,  default=random_integer, unique=True)

2
为什么将该列设为字符串而不是整数? - Cobble
问题明确说明OP想要一个整数类型,所以这个答案不可行。请查看我的答案获取整数类型。 - Astariul

0

数据库中的INTEGER类型是4字节(32位)。

uuid.uuid4().int生成一个128位整数。

因此,只需忽略大部分位数(使用位移运算符):

uuid = Column(Integer,  default=lambda: uuid.uuid4().int >> (128 - 32), unique=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接