我有一个表,我试图使用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}
第一个问题 - 参数输入'?'的顺序是什么?物。如您所见,字段显示如下:
team
jersey_colour
stadium
goals
date
assists
但是,字典顺序是任意的:
jersey_colour
team
stadium
date
assists
goals
这是sqlite还是mysql的问题?理论上提供了密钥,因此它应该能够确定存储数据的位置,但我不确定。为了生产,我将使用mysql数据库但是为了测试我正在使用inmemory sqlite db。
第二个问题,错误:
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()
所以我不确定错误发生的原因。感谢您对#1和#2问题的帮助。谢谢。
答案 0 :(得分:2)
SQLAlchemy负责绑定参数和排序。没有必要担心这一点。
您在SQLAlchemy ORM元数据定义中指定了您正在处理日期列。然后SQLAlchemy处理到后端数据库的正确表单的转换。错误来自SQLAlchemy,不是 SQLLite; SA为您翻译日期对象。
这两种方式都是 ;即使使用SQLLite,您也可以放入日期对象,当您查询时,可以再次获取日期对象 out 。
你链接的帖子的回复谈到了那里的相同事情;如果您希望将日期存储为字符串,请使用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}