sqlalchemy:无法保存具有日期列的模型

2024-09-30 10:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经通过声明性的创建了一个模型:

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数据库时:

^{pr2}$

我有以下错误:

(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)}]

我做错什么了?不应该日期时间.日期物体是那样工作的?在


Tags: testidtruedefaultinputbasedatetimedate
1条回答
网友
1楼 · 发布于 2024-09-30 10:35:56

没有答案*,只是进一步调查的想法

无法在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()

输出:

^{pr2}$

相关问题 更多 >

    热门问题