1

我在 python 中使用 SQLAlchemy 创建了一个简单的数据库,并且每个输入的用户都有一个唯一用户 ID 列。我希望有一个运行计数器,在添加新用户时提供下一个 ID。

实现这一点的最佳方法是什么?具有最后一个 id 编号值的列,或者是一个完全独立的表(似乎很浪费)。有没有办法检查最后一个 User.id 并添加一个?这是用户基类:

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key = True)
    email_address = Column(String, nullable = False)
    username = Column(String, nullable = False)
    password = Column(String, nullable = False)
    first_name = Column(String)
    full_name = Column(String)
    join_date = Column(DateTime, default=func.now()) # enters the time upon initialization

    def __init__(self, email_address, username, password):
        self.email_address = email_address
        self.username = username
        self.password = password

    def __repr__(self):
        return "<User('%s', '%s', '%s', '%s')>" % (self.email_address, self.username, self.password, self.join_date)
4

3 回答 3

5

阅读:http ://www.sqlalchemy.org/docs/core/schema.html#defining-sequences 。

密钥生成是数据库的一部分。

您只是希望数据库分配唯一键。

于 2011-09-06T20:14:43.870 回答
0

你用的是什么数据库?如果是 MySQL,你可能已经完成了。尝试创建一个 User.id = None 的用户。它应该采用下一个可用的 id。如果是自动递增的,在插入用户后,正确的 id 将被放置在 User.id 中。

我通常在 SQLAlchemy 之外创建我的模式。您想要的是将 id 列作为主键,而不是 null,并设置为自动增量。然后,如果您不分配 id,它将自动获取下一个 id。

于 2011-09-06T20:47:18.753 回答
0

在将新创建的对象刷新到数据库后,id 将自动获取唯一值,因此,据我所知,如果您现在需要用户 id,则必须运行 session.flush() :

>>> user = User(email_address, username, password)
>>> print user.id
None
>>> session.add(user)
>>> session.flush()
>>> print user.id
100500

Also, please, don't use this terrible __init__ methods! You need a custom init only if you want to add a some custom logic or validation on it. But such simple cases as assigning keyword arguments as corresponding object attributes already provided by declarative_base class (Base).

于 2011-09-06T21:05:50.633 回答