2013-07-23 5 views
5

ho una mappatura di classe sqlalchemy ad una tabella di database in MySQL InnoDB. La tabella ha diverse colonne e io sono in grado di li popolano con successo tutti, tranne da una colonna timestamp:Inserire MySQL valore colonna timestamp con SQLAlchemy

La mappatura:

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

La colonna su MySQL è un TIMESTAMP che ha CURRENT_TIMESTAMP come valore di default, ma quando Inserisco una riga che viene riempita con NULL.

Se di default non funziona poi ho bisogno di impostare manualmente la data e ora, come avrei potuto fare una di esse.

codice SQLAlchemy per inserire riga alla tabella:

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

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

risposta

10

datetime oggetti vengono convertiti in timestamp, quindi si può semplicemente utilizzare:

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

o datetime.utcnow() se si vuole salvarlo utilizzando UTC. L'impostazione predefinita (CURRENT_TIMESTAMP) utilizza il fuso orario locale, quindi datetime.now() è più vicino a questo, ma quasi sempre dovrebbe essere preferibile memorizzare i dati relativi all'ora in UTC e effettuare conversioni del fuso orario solo quando si presentano i dati all'utente.

6

risposta mata è molto chiaro su come aggiungere un valore di timestamp. Se si desidera aggiungere il timestamp aggiunto automatically su insert e update. Si può prendere in considerazione una classe BaseMixin e registrare l'evento sqlalchemy per ogni classe. esempio di implementazione è qui sotto:

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) 

cambiare la vostra class HarvestSources(Base):-class HarvestSources(Base, BaseMixin):. chiama HarvestSources.register() sul tuo modello init. La colonna updated_at e created_at si aggiornerà automaticamente.