2013-07-23 26 views
5

ile MySQL zaman damgası sütun değerini ekle MySQL innoDB'deki bir veritabanı tablosuna bir sqlalchemy sınıfı eşleme var. Tablo birkaç sütun var ve ben bütün bir TIMESTAMP sütundan dışında başarıyla doldurmamız mümkün duyuyorum:SqlAlchemy

haritalama:

class HarvestSources(Base): 
    __table__ = Table('harvested', metadata, autoload=True) 

MySQL sütun varsayılan değer olarak current_timestamp olan bir TIMESTAMP, ama ne zaman NULL ile doldurulduğu bir satır ekliyorum.

Varsayılan değer çalışmıyorsa, zaman damgasını manuel olarak ayarlamalıyım, bunlardan birini nasıl yapabilirim?

source = HarvestSources() 
source.url = url 
source.raw_data = data 
source.date = ? 

DB.session.add(source) 
DB.session.commit() 

cevap

10

datetime nesneler damgaları dönüştürülür, böylece sadece kullanabilirsiniz::

sqlalchemy kod tabloya satır eklemek

from datetime import datetime 
... 
source.date = datetime.now() 

veya datetime.utcnow() sen utc kullanarak kaydetmek istiyorum. Varsayılan (CURRENT_TIMESTAMP) yerel saat dilimini kullanır, bu nedenle datetime.now() buna daha yakındır - ancak zamanla ilgili verileri UTC'de depolamak ve yalnızca kullanıcıya veri sunarken saat dilimi dönüşümlerini yapmak neredeyse her zaman tercih edilmelidir.

6

mata yanıtı, zaman damgası değeri ekleme konusunda çok nettir. Zaman damgasını eklemek isterseniz automaticallyinsert ve update'a ekleyin. Her sınıf için bir BaseMixin sınıfına sahip olabilir ve sqlalchemy olayını kaydedebilirsiniz. Örnek uygulama aşağıdaki gibidir:

class BaseMixin(object): 

    __table_args__ = {'mysql_engine': 'InnoDB'} 

    id = sa.Column(sa.Integer, primary_key=True) 
    created_at = sa.Column('created_at', sa.DateTime, nullable=False) 
    updated_at = sa.Column('updated_at', sa.DateTime, nullable=False) 

    @staticmethod 
    def create_time(mapper, connection, instance): 
    now = datetime.datetime.utcnow() 
    instance.created_at = now 
    instance.updated_at = now 

    @staticmethod 
    def update_time(mapper, connection, instance): 
    now = datetime.datetime.utcnow() 
    instance.updated_at = now 

    @classmethod 
    def register(cls): 
    sa.event.listen(cls, 'before_insert', cls.create_time) 
    sa.event.listen(cls, 'before_update', cls.update_time) 
senin class HarvestSources(Base): class HarvestSources(Base, BaseMixin): değiştirmek

. modelinize ait HarvestSources.register() numaralı telefonu arayın. updated_at ve created_at sütunu otomatik olarak güncellenir.