2011-09-06 78 views
1

我已经在python中使用SQLAlchemy创建了一个简单的数据库,并且每个输入的用户都有一个唯一的用户ID列。我希望有一个运行计数器,在添加新用户时提供下一个ID。在Python中生成用户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) 
+1

您的缩进不正确。你能修好吗? –

回答

5

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

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

您只需要数据库分配唯一的密钥。

+0

正是我需要的!这可能是一个愚蠢的问题,但是当它从一个序列创建User(和id以及它)时,我还有其他表(包括名为user_id的Column)('accounts','passwords')。这是一个连接到User.id的外键,所以当我创建一个用户时,是否也会创建这些表,并立即连接accounts.user_id? – Chris

+0

@Chris:“所以当我创建一个用户时,这些表是否也被创建,并且是accounts.user_id立即链接?”是什么给了你这个想法?请阅读SQLAlchemy文档。你的问题的答案是“不”。 –

0

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

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

0

ID将采取独特的价值新创建的对象刷新到数据库后自动,所以,我知道,你必须运行调用Session.flush()如果你现在需要的用户ID:

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

另外,请,千万不要用这种可怕的方法!只有当你想添加一些自定义逻辑或验证时,你才需要一个自定义的init。但是,将关键字参数指定为declarative_base class(Base)已提供的相应对象属性这样的简单情况。