4

谁能告诉我为什么下面的 DateTime 类型会创建一个“DATE”对象而不是 DateTime(或更恰当地说,是一个 TIMESTAMP 类型),因为我必须强制如下行中的类型:

#!/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

Oracle 没有DateTime数据类型。在 Oracle 中,aDate包含日期(即 2012 年 8 月 21 日)和时间(即下午 1:30),粒度为 1 秒。A Timestamp,没有其他限定符,仅允许您将粒度增加到纳秒(10^-9 秒)。DateTimeSQLAlchemy 将 a转换为 Oracle似乎是合理的,Date除非有一些要求DateTime支持小数秒(在这种情况下您需要 a Timestamp)或时区(在这种情况下您需要 a Timestamp with [local] time zone)。

于 2012-08-21T17:33:42.940 回答
0

要创建一个TIMESTAMP对象,您可能想要Time使用

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

虽然,只有在设置为时, DateTimeinsqlalchemy才会获得带有 TIMEZONE 的 TIMESTAMP 。默认为。TIMEZONETRUEFALSE

类 sqlalchemy.types.DateTime(timezone= False )

init (timezone=False) 构造一个新的 DateTime。

参数:时区 - 布尔值。如果为 True,并且受后端支持,将生成“TIMESTAMP WITH TIMEZONE”。对于不支持时区感知时间戳的后端,无效。

设置timezone=True应该可以工作,因为 Oracle 确实支持带时区的时间戳,所以您可能必须设置它。

于 2012-09-05T22:15:26.103 回答