Это может быть относительно простой вопрос для ответа. Но я включу весь свой код только для полноты.Конфигурирование MySQL для генерации значений первичного ключа
Я генерирую альфа-числовые первичные ключи для своих таблиц MySQL, используя класс, найденный here. Тем не менее, когда я загрузить строку в базу данных, я получаю эту ошибку:
FlushError: Instance <User at 0x1d47110> has a NULL identity key. If this is an auto-generated value, check that the database table allows generation of new primary key values, and that the mapped Column object is configured to expect these generated values. Ensure also that this flush() is not occurring at an inappropriate time, such as within a load() event.
Итак, вот код, когда я использую GUID код из SQLAlchemy источника:
User.py
from app import db
from app.custom_db.GUID import GUID
class User(db.Model):
__tablename__ = 'users'
id = db.Column(GUID(), primary_key = True)
name = db.Column(db.String(40), unique = True)
email_stub = db.Column(db.String(30), unique = True)
def __init__(self, name, email_stub):
self.name = name
self.email_stub = email_stub
def __repr__(self):
return '<User %r>' % self.name
Когда я просто использую db.Integer
, он отлично работает. Но, как я уже сказал, я хочу, чтобы пользовательские альфа-цифровые uuid4()
первичные ключи. Как я могу заставить мою базу данных MySQL не жаловаться, когда я это делаю?
Просто нужно добавить, что использование UUID в качестве первичного ключа не является хорошей идеей. InnoDB использует первичный ключ в каждом вторичном ключе и добавляет 16 байт для каждого ключа. Лучше всего использовать целое число как первичный ключ (и использовать AUTO_INCREMENT) и сделать GUID вторичным ключом. Кроме того, что еще более важно, сохраните GUID как BINARY (16). Это может быть не важно с 1000 пользователями, но с миллионом это будет. – geertjanvdk
Действительно? Является ли автоинкрементное целое безопасным? Я чувствую, что это облегчило бы представлять других пользователей, если бы вы могли угадать их первичный ключ. –
Вы никогда не должны раскрывать свой первичный ключ, если он не случайный. Вы открываете случайный GUID (как шестнадцатеричный) и используете первичный ключ внутри. Вы сэкономите много сетевого трафика и пространства, идущего от ~ 16-32 байт до 4 или 8 байтов (INT/BIGINT). – geertjanvdk