1

我有一个表,我试图使用 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 Date 类型只接受 Python 日期对象作为输入。(原始原因:TypeError:SQLite Date 类型只接受 Python 日期对象作为输入。)'INSERT INTO "hockey" (team, jersey_colour, Stadium, goal, date, assistants) VALUES (?, ?, ?, ?, ?, ? )' [{'jersey_colour': 'Blue', 'team': 'Toronto Maple Leafs', 'stadium': u'Air Canada Centre', 'date': '2013-03-25', 'assists': 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 的 Date() 类型需要 Python 日期时间,即“import datetime; date = datetime.date(year, month day)”。

    与 data 键配对的值是由 Python datetime.date 命令根据上面评论员所说的创建的。

    >>>today_date = datetime.date.today()
    

所以我不确定为什么会发生错误。感谢您对问题 #1 和 #2 的帮助。谢谢你。

4

1 回答 1

2
  1. SQLAlchemy 负责绑定参数和排序。没有必要为此担心。

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

    这是双向的;即使在使用 SQLLite 时,您也可以放入日期对象,而在查询时,您又可以取出日期对象

对您链接到的帖子的回复在那里谈到了同样的事情;String()如果您想将日期存储为字符串,请使用列,如果您将列声明为 type ,请使用datetime.date()or实例。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}
于 2013-03-26T18:39:12.027 回答