2013-07-23 14 views
5

MySQLのinnoDBのデータベーステーブルにsqlalchemyクラスのマッピングがあります。表には、いくつかの列を持っていると私は正常にTIMESTAMP列から除き、それらすべてを移入することができる午前:SqlAlchemyでMySQLのタイムスタンプ列の値を挿入します。

マッピングを:

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

のMySQLのカラムにデフォルト値としてCURRENT_TIMESTAMPを持つTIMESTAMPですが、とき私はそれがNULLで埋まっている行を挿入します。

デフォルトが機能していない場合は、手動でタイムスタンプを設定する必要があります。

テーブルに行を挿入するSQLAlchemyのコード:

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

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

答えて

10

datetimeオブジェクトは、タイムスタンプに変換されますので、あなただけ使用することができます。

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

またはdatetime.utcnow()あなたは、UTCを使用して、それを保存したい場合。デフォルト(CURRENT_TIMESTAMP)はローカルタイムゾーンを使用しているので、datetime.now()はこれに近いですが、ほとんどの場合、時間関連のデータをUTCで保存し、ユーザーにデータを提示するときだけタイムゾーン変換を行うことをお勧めします。

6

タイムスタンプ値を追加する方法は非常に明確です。追加されたタイムスタンプをinsertupdateに追加する場合は、automaticallyを追加します。 BaseMixinクラスを持ち、すべてのクラスに対してsqlalchemyイベントを登録すると考えられます。例の実装は以下の通りです:

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) 
はあなた class HarvestSources(Base): class HarvestSources(Base, BaseMixin):には変更

。 お使いのモデルのinit HarvestSources.register()に電話してください。 updated_atcreated_at列は自動的に更新されます。

関連する問題