2013-04-16 4 views
0

Я использую SQLAlchemy как свой слой ORM для доступа к моей базе данных MySQL.Автоинкремент не написан на объект

Вот таблица, картограф и модель, я говорю:

CREATE TABLE user (
    uid INT(12) NOT NULL auto_increment, 
    email VARCHAR(128) NOT NULL, 
    password VARCHAR(128) NOT NULL, 
    display_name VARCHAR(128) NOT NULL, 
    timezone VARCHAR(96) NOT NULL, 
    join_date DATETIME NOT NULL, 
    last_login DATETIME NOT NULL, 
    verified INT(1) NOT NULL DEFAULT 0, 
    PRIMARY KEY (uid), 
    UNIQUE (email) 
) ENGINE=InnoDB; 

class User(object): 
    def __init__(self, id=0, email="", password="", displayName="", 
       timezone="UTC", joinDate=None, lastLogin=None, verified=False): 
    self.id = id 
    self.email = email 
    self.password = password 
    self.displayName = displayName 
    self.timezone = timezone 
    self.joinDate = joinDate or datetime.utcnow() 
    self.lastLogin = lastLogin or datetime.utcnow() 
    self.verified = verified 


userTable = sqlalchemy.Table('user', meta, autoload=True) 

sqlalchemy.orm.mapper(models.User, userTable, properties={ 
    'id': userTable.c.uid, 
    'displayName': userTable.c.display_name, 
    'joinDate': userTable.c.join_date, 
    'lastLogin': userTable.c.last_login 
} 

Проблема заключается в том, что всякий раз, когда я пытаюсь вставить объект в базу данных через ORM слой, я ожидаю, что вновь сгенерированный идентификатор, который будет создан в моем исходном объекте для дальнейшего использования. В противном случае все это было бы бесполезно для меня.

>>> session = Session() 
>>> u = User(0, '[email protected]', 'asdf', 'Test User') 
>>> session.add(u) 
>>> session.flush() 
>>> u.id 
0 

Кто-нибудь знает, как сказать SQLALchemy, чтобы сохранить идентификатор в исходном объекте? Спасибо.

+3

Вы пытались передать NULL (или None или что-то другое, что он использует для NULL) вместо нуля? – msw

+0

+1 - NULL - это не то же самое, что и ноль. NULL использует следующий идентификатор auto_increment, тогда как нуль использует буквальный ноль. – Aya

ответ

0

Конечно, @msw и @Aya правы. Атрибут id объекта должен быть None перед вставкой в ​​базу данных.

Смежные вопросы