2011-09-06 5 views
1

나는 파이썬에서 SQLAlchemy를 사용하여 간단한 DB를 만들었고 입력 된 각 사용자에 대한 고유 한 사용자 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라는 컬럼을 포함하는 다른 테이블 ('accounts', 'passwords')을 가지고 있습니다. 이것은 User.id에 연결된 ForeignKey이므로 사용자를 만들 때 해당 테이블도 만들어지고 즉시 accounts.user_id가 링크됩니까? – Chris

+0

@Chris : "사용자를 만들면 해당 테이블도 만들어지며 즉시 accounts.user_id가 링크됩니까?" 너 한테 그 아이디어가 뭐야? SQLAlchemy 문서를 읽으십시오. 귀하의 질문에 대한 대답은 "아니오"입니다. –

0

어떤 데이터베이스를 사용하고 있습니까? MySQL의 경우 이미 완료되었을 수 있습니다. User.id = None 인 사용자 작성을 시도하십시오. 다음 사용 가능한 ID를 가져야합니다. 자동 증가하는 경우 사용자 삽입 후 올바른 ID는 User.id에 배치됩니다.

저는 일반적으로 SQLAlchemy 외부에서 내 스키마를 만듭니다. 원하는 것은 id 컬럼이 널이 아닌 기본 키가되고 autoincrement로 설정되는 것입니다. 그런 다음 id를 지정하지 않으면 다음 id를 자동으로 취합니다.

0

ID는 자동으로 DB에 새로 생성 된 객체를 세척 후에는 고유 한 값을 가지고, 그래서, 내가 아는 한, 당신은 Session.flush()를 실행해야합니다 당신은 지금 사용자 ID가 필요한 경우 : 또한

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

,하시기 바랍니다 ,이 끔찍한 방법을 사용하지 마십시오 __init__ 방법! 사용자 정의 논리 또는 유효성 검증을 추가하려는 경우에만 사용자 정의 init이 필요합니다. 그러나 키워드 인수를 이미 declarative_base 클래스 (Base)가 제공하는 해당 객체 속성으로 할당하는 간단한 경우입니다.