Python sqlalchemy:无法使用日期列保存模型

Python sqlalchemy:无法使用日期列保存模型,python,sqlite,postgresql,sqlalchemy,Python,Sqlite,Postgresql,Sqlalchemy,我已通过声明性_库创建了一个模型: Base = declarative_base() class Record(Base): __tablename__ = 'test' id = Column(BigInteger, primary_key=True) datefrom = Column(Date) dateto = Column(Date) active = Column(Boolean, index=True, default=True)

我已通过声明性_库创建了一个模型:

Base = declarative_base()

class Record(Base):
    __tablename__ = 'test'

    id = Column(BigInteger, primary_key=True)
    datefrom = Column(Date)
    dateto = Column(Date)
    active = Column(Boolean, index=True, default=True)
    created = Column(DateTime, default=datetime.datetime.utcnow)
当我尝试将模块保存到postgres数据库时:

dfrom = datetime.datetime.strptime(somestring, '%d/%m/%Y').date()
dto = datetime.datetime.strptime(someotherstring, '%d/%m/%Y').date()
record = Record(datefrom=dfrom, dateto=dto)
session.add(record)
session.commit()
我得到了以下错误:

(DataError) invalid input syntax for type date: \"\"\nLINE 1: ...'2013-11-26'::date, '2013-12-27'::date...\n ^\n 'INSERT INTO test (datefrom, dateto, active, created) VALUES (%(datefrom)s, %(dateto)s, %(active)s, %(created)s) RETURNING test.id' {'created': datetime.datetime(2013, 11, 27, 20, 12, 55, 716185), 'dateto': datetime.date(2013, 12, 27), 'datefrom': datetime.date(2013, 11, 26), 'active': True}
sqlite后端也存在类似错误:

SQLite Date type only accepts Python date objects as input. (original cause: TypeError: SQLite Date type only accepts Python date objects as input.) 'INSERT INTO test (datefrom, dateto, active, created) VALUES (?, ?, ?, ?)' [{'dateto': datetime.date(2013, 12, 27), 'datefrom': datetime.date(2013, 11, 26)}]
那么我做错了什么?datetime.date对象不应该这样工作吗?

不是答案*,只是进一步调查的想法:

无法在SQLite上重现该问题。下面的自包含代码运行正常,并生成提供的输出。你有什么不同?你能把你的问题简化成一个类似的例子,看看它有什么不同吗?(注:使用SA v0.8.3)

代码:

import datetime

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)

# object model
class Record(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    datefrom = Column(Date)
    dateto = Column(Date)
    active = Column(Boolean, index=True, default=True)
    created = Column(DateTime, default=datetime.datetime.utcnow)

# create db schema
Base.metadata.create_all(engine)
session = Session()

# TEST INSERT DATA
somestring, someotherstring = '3/1/2008', '1/3/1988'
dfrom = datetime.datetime.strptime(somestring, '%d/%m/%Y').date()
dto = datetime.datetime.strptime(someotherstring, '%d/%m/%Y').date()
record = Record(datefrom=dfrom, dateto=dto)
session.add(record)
session.commit()
session.expunge_all()
2013-11-28 09:17:14,608 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("test")
2013-11-28 09:17:14,608 INFO sqlalchemy.engine.base.Engine ()
2013-11-28 09:17:14,609 INFO sqlalchemy.engine.base.Engine
CREATE TABLE test (
        id INTEGER NOT NULL,
        datefrom DATE,
        dateto DATE,
        active BOOLEAN,
        created DATETIME,
        PRIMARY KEY (id),
        CHECK (active IN (0, 1))
)


2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine ()
2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine COMMIT
2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_test_active ON test (active)
2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine ()
2013-11-28 09:17:14,612 INFO sqlalchemy.engine.base.Engine COMMIT
2013-11-28 09:17:14,618 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2013-11-28 09:17:14,618 INFO sqlalchemy.engine.base.Engine INSERT INTO test (datefrom, dateto, active, created) VALUES (?, ?, ?, ?)
2013-11-28 09:17:14,618 INFO sqlalchemy.engine.base.Engine ('2008-01-03', '1988-03-01', 1, '2013-11-28 08:17:14.619000')
2013-11-28 09:17:14,619 INFO sqlalchemy.engine.base.Engine COMMIT
输出:

import datetime

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)

# object model
class Record(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    datefrom = Column(Date)
    dateto = Column(Date)
    active = Column(Boolean, index=True, default=True)
    created = Column(DateTime, default=datetime.datetime.utcnow)

# create db schema
Base.metadata.create_all(engine)
session = Session()

# TEST INSERT DATA
somestring, someotherstring = '3/1/2008', '1/3/1988'
dfrom = datetime.datetime.strptime(somestring, '%d/%m/%Y').date()
dto = datetime.datetime.strptime(someotherstring, '%d/%m/%Y').date()
record = Record(datefrom=dfrom, dateto=dto)
session.add(record)
session.commit()
session.expunge_all()
2013-11-28 09:17:14,608 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("test")
2013-11-28 09:17:14,608 INFO sqlalchemy.engine.base.Engine ()
2013-11-28 09:17:14,609 INFO sqlalchemy.engine.base.Engine
CREATE TABLE test (
        id INTEGER NOT NULL,
        datefrom DATE,
        dateto DATE,
        active BOOLEAN,
        created DATETIME,
        PRIMARY KEY (id),
        CHECK (active IN (0, 1))
)


2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine ()
2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine COMMIT
2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine CREATE INDEX ix_test_active ON test (active)
2013-11-28 09:17:14,611 INFO sqlalchemy.engine.base.Engine ()
2013-11-28 09:17:14,612 INFO sqlalchemy.engine.base.Engine COMMIT
2013-11-28 09:17:14,618 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2013-11-28 09:17:14,618 INFO sqlalchemy.engine.base.Engine INSERT INTO test (datefrom, dateto, active, created) VALUES (?, ?, ?, ?)
2013-11-28 09:17:14,618 INFO sqlalchemy.engine.base.Engine ('2008-01-03', '1988-03-01', 1, '2013-11-28 08:17:14.619000')
2013-11-28 09:17:14,619 INFO sqlalchemy.engine.base.Engine COMMIT

datetime.datetime.strtime
返回一个
datetime
对象。如果您只需要日期,请使用
datetime.date.strtime
。啊,是的,对不起,我错误地复制了代码。当然我使用了…strtime(…).date()。date类没有strtime AFAIK…那么,Blender的评论是否帮助您解决了这个问题?您是否仍遇到此问题?如果是,你能用你的新代码/错误更新问题吗?如果问题解决了,你能回答这个问题吗?没有。有问题的代码现在已经更新了。所以我运行了你的测试脚本,它运行正常。然后开始修改您的测试模型,发现了愚蠢的打字错误,我在另外两列中使用了日期类型而不是整数类型。抱歉浪费你们的时间。下次我应该少复制/粘贴。