Генерация идентификаторов пользователя в Python

1

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

Какой был бы лучший способ реализовать это? Столбец со значением последнего номера 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
    Ваш отступ не прав. Вы можете это исправить, пожалуйста?
Теги:
database
sqlalchemy
userid

3 ответа

5
Лучший ответ

Прочтите это: http://www.sqlalchemy.org/docs/core/schema.html#defining-sequences.

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

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

  • 0
    Именно то, что мне было нужно! Это может быть глупый вопрос, но когда он создает пользователя (и идентификатор вместе с ним из последовательности), у меня также появляются другие таблицы («учетные записи», «пароли»), которые содержат столбец с именем user_id. Это ключ ForeignKey, связанный с User.id, поэтому, когда я создаю пользователя, эти таблицы также создаются, и немедленно ли связаны с account.user_id?
  • 0
    @Chris: "поэтому, когда я создаю пользователя, эти таблицы тоже создаются, и сразу ли связаны с account.user_id?" Что дало вам эту идею? Пожалуйста, прочитайте документацию по SQLAlchemy. Ответ на ваш вопрос "Нет"
0

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

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

0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню