4

下の行のようにタイプを強制する必要があるため、以下のDateTimeタイプがDateTime(またはより適切にはTIMESTAMPタイプ)ではなく「DATE」オブジェクトを作成する理由を誰か教えてください:

#!/bin/python

import sqlalchemy

from sqlalchemy import Column, Integer, String, DateTime, Index, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy.orm import sessionmaker
from sqlalchemy.dialects import oracle

Base = declarative_base()

import logging

logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

class TypeTest(Base):
    __tablename__ = "TYPETESTZ"
    thisisinteger = Column(Integer, primary_key = True)
    thisisnotadatetime = Column(DateTime)
    thisisdatetime = Column(oracle.TIMESTAMP)    

if __name__ == "__main__":
    engine = sqlalchemy.create_engine('oracle://richard:password@xe')
    metadata = Base.metadata
    metadata.create_all(engine)

ログ出力:

INFO:sqlalchemy.engine.base.Engine:SELECT USER FROM DUAL
INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:SELECT table_name FROM all_tables WHERE table_name = :name AND owner = :schema_name
INFO:sqlalchemy.engine.base.Engine:{'name': u'TYPETESTZ', 'schema_name': u'RICHARD'}
INFO:sqlalchemy.engine.base.Engine:
CREATE TABLE "TYPETESTZ" (
    thisisinteger INTEGER NOT NULL, 
    thisisnotadatetime DATE, 
    thisisdatetime TIMESTAMP, 
    PRIMARY KEY (thisisinteger)
)


INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:COMMIT
4

2 に答える 2

2

DateTimeOracle にはデータ型がありません。Oracle では、aDateには日 (2012 年 8 月 21 日など) と時刻 (午後 1 時 30 分など) の両方が含まれ、粒度は 1 秒です。ATimestampは、修飾子を追加せずに、粒度をナノ秒 (10^-9 秒) に増やすことしかできません。が小数秒 ( が必要な場合) またはタイムゾーン ( が必要な場合 ) をサポートするという要件がない限り、SQLAlchemy が aDateTimeを Oracleに変換することは合理的と思われます。DateDateTimeTimestampTimestamp with [local] time zone

于 2012-08-21T17:33:42.940 に答える
0

次のようTIMESTAMPに使用したいオブジェクトを作成するにはTime

from sqlalchemy import Column, Integer, String, Time, Index, MetaData

ただし、DateTimeが に設定されているsqlalchemy場合にのみ、 が TIMEZONE の TIMESTAMP を取得します。デフォルトはです。TIMEZONETRUEFALSE

クラス sqlalchemy.types.DateTime(timezone= False )

init (timezone=False) 新しい DateTime を構築します。

パラメータ: タイムゾーン - ブール値。True の場合、バックエンドでサポートされ、'TIMESTAMP WITH TIMEZONE' が生成されます。タイムゾーン対応のタイムスタンプをサポートしていないバックエンドの場合、効果はありません。

Oracleはタイムゾーン付きのタイムスタンプをサポートしているため、設定timezone=Trueが機能するはずです。そのため、設定する必要がある場合があります。

于 2012-09-05T22:15:26.103 に答える