Генерация идентификаторов пользователя в Python - PullRequest
1 голос
/ 07 сентября 2011

Я создал простую БД с использованием SQLAlchemy в python, и для каждого введенного пользователя есть столбец с уникальным идентификатором пользователя.Я хочу иметь счетчик хода, который выдает следующий идентификатор при добавлении нового пользователя.

Каков наилучший способ реализовать это?Столбец со значением последнего номера идентификатора, или это будет полностью отдельная таблица (кажется расточительной). Есть ли способ проверить последний 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)

Ответы [ 3 ]

5 голосов
/ 07 сентября 2011

Читать это: http://www.sqlalchemy.org/docs/core/schema.html#defining-sequences.

Генерация ключей является частью базы данных.

Вы просто хотите, чтобы база данных присваивала уникальные ключи.

0 голосов
/ 07 сентября 2011

id примет уникальное значение автоматически после сброса вновь созданного объекта в БД, поэтому, как я знаю, вы должны запустить session.flush (), если вам нужен идентификатор пользователя прямо сейчас:

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

Также, пожалуйста, не используйте эти ужасные __init__ методы! Пользовательская инициализация требуется только в том случае, если вы хотите добавить к ней некоторую пользовательскую логику или проверку. Но такие простые случаи, как назначение аргументов ключевых слов в качестве соответствующих атрибутов объекта, уже предоставлены declarative_base class (Base).

0 голосов
/ 07 сентября 2011

Какую базу данных вы используете?Если это MySQL, возможно, вы уже сделали.Попробуйте создать пользователя, где User.id = Нет.Это должно занять следующий доступный идентификатор.Если это автоинкремент, после добавления пользователя правильный идентификатор будет помещен в User.id.

Обычно я создаю свою схему вне SQLAlchemy.Вам нужно, чтобы столбец идентификатора был первичным ключом, а не нулем, и имел значение автоинкремента.Затем, если вы не назначите идентификатор, он автоматически получит следующий идентификатор.

...