insertmany in in memory sqllite db - SQLite Date类型只接受Python日期对象作为输入

时间:2013-03-26 18:34:13

标签: python sqlite insert sqlalchemy runtime-error

我有一个表,我试图使用dict对象插入许多。

engine = create_engine('sqlite:///:memory:', echo=True)
metadata = MetaData()
hockey= Table('hockey', metadata, 
    Column('team', String(16), primary_key=True),
    Column('jersey_colour', String(16)),
    Column('stadium', String(32)),
    Column('goals', Integer),
    Column('date', Date, primary_key=True),
    Column('assists', Integer))

>>>data[0]
{'jersey_colour': u'Blue',
 'team': u'Toronto Maple Leafs',
 'stadium': u'Air Canada Center',
 'date': '2013-03-25',
 'assists': 301,
 'goals': 151}

>>>data[1]
{'jersey_colour': u'Red',
 'team': u'Calgary Flames',
 'stadium': u'PenWest',
 'date': '2013-03-25',
 'assists': 254,
 'goals': 147}

conn = engine.connect()
conn.execute(ins, data)
  

StatementError:SQLite日期类型仅接受Python日期对象   输入。 (原因:TypeError:SQLite日期类型只接受   Python日期对象作为输入。)'INSERT INTO“曲棍球”(团队,   jersey_colour,体育场,进球,约会,助攻)价值观(?,?,?,?,?,   ?)'[{'jersey_colour':'Blue','team':'Toronto Maple Leafs',   '体育场':u'Air Canada Centre','date':'2013-03-25','助攻':301,   '目标':151}

  1. 第一个问题 - 参数输入'?'的顺序是什么?物。如您所见,字段显示如下:

    team
    jersey_colour
    stadium
    goals
    date
    assists
    

    但是,字典顺序是任意的:

    jersey_colour
    team
    stadium
    date
    assists
    goals
    

    这是sqlite还是mysql的问题?理论上提供了密钥,因此它应该能够确定存储数据的位置,但我不确定。为了生产,我将使用mysql数据库但是为了测试我正在使用inmemory sqlite db。

  2. 第二个问题,错误:

    StatementError: SQLite Date type only accepts Python date objects as input
    

    我发现了以下内容(https://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/EeZbkePPb38),其中包含:

      

    SQLite没有专门的DATE类型。 SQLAlchemy的日期()   type期望Python datetime,即“import datetime; date =   datetime.date(年,月日)“。

    与数据键配对的值由Python datetime.date命令根据评论员上面所述的内容创建。

    >>>today_date = datetime.date.today()
    
  3. 所以我不确定错误发生的原因。感谢您对#1和#2问题的帮助。谢谢。

1 个答案:

答案 0 :(得分:2)

  1. SQLAlchemy负责绑定参数和排序。没有必要担心这一点。

  2. 您在SQLAlchemy ORM元数据定义中指定了您正在处理日期列。然后SQLAlchemy处理到后端数据库的正确表单的转换。错误来自SQLAlchemy,不是 SQLLite; SA为您翻译日期对象。

    这两种方式都是 ;即使使用SQLLite,您也可以放入日期对象,当您查询时,可以再次获取日期对象 out

  3. 你链接的帖子的回复谈到了那里的相同事情;如果您希望将日期存储为字符串,请使用String()列,如果您将列声明为datetime.date()类型,请使用datetime.datetime()Date()个实例。

    您的date密钥是一个字符串;使用datetime.date()对象来避免错误:

    {'jersey_colour': u'Blue',
     'team': u'Toronto Maple Leafs',
     'stadium': u'Air Canada Center',
     'date': datetime.date(2013, 3, 25),
     'assists': 301,
     'goals': 151}