Я создал простую БД, используя 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)
Прочтите это: http://www.sqlalchemy.org/docs/core/schema.html#defining-sequences.
Генерация ключей является частью базы данных.
Вы просто хотите, чтобы база данных назначала уникальные ключи.
Какую базу данных вы используете? Если это MySQL, вы уже можете это сделать. Попробуйте создать пользователя, где User.id = None. Он должен использовать следующий доступный идентификатор. Если это автоинкремент, после вставки Пользователя правильный идентификатор будет помещен в User.id.
Обычно я создаю свою схему вне SQLAlchemy. Вы хотите, чтобы столбец id был первичным ключом, а не null, и был установлен на автоинкремент. Затем, если вы не назначаете идентификатор, он автоматически примет следующий идентификатор.
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).