SQLAlchemy:如何在多个insert语句中将字符串值转换为日期?

时间:2016-09-08 11:27:55

标签: python sqlite sqlalchemy

我有一个dict对象列表

data = [
{'id': 1, 'dt':'2002-01-02' },
{'id': 2, 'dt':'2014-01-15' },
{'id': 3, 'dt':'2005-10-20' }
]

和使用sqlalchemy创建的sqlite中的表如下

engine = create_engine(config.SQLALCHEMY_DATABASE_URI)
metadata = MetaData()

tbl1 = Table('t1', metadata,
                     Column('the_id', Integer, primary_key=True),
                     Column('the_dt', Date))

metadata.create_all(bind=engine)

stmt_insert = tbl1.insert().values(the_id=bindparam('id'), the_dt=bindparam('dt', type_=Date)

with engine.connect() as conn:
    conn.execute(stmt_insert, data)

这给了我以下错误:

  

sqlalchemy.exc.StatementError:(builtins.TypeError)SQLite日期类型   只接受Python日期对象作为输入。

我应该为“type_”参数分配什么才能使这个绑定工作?

1 个答案:

答案 0 :(得分:2)

您需要将In [1]: edit_config() 字符串转换为日期对象,例如:

dt

如果您不需要SQLAlchemy的ORM部分(没有类/表映射)。最简单的方法是告诉SQLAlchemy你使用String而不是Date,如下所示:

import datetime
for item in data:
    item['dt'] = datetime.datetime.strptime(item['dt'], "%Y-%m-%d").date()

它会起作用,因为您的日期字符串使用ISO 8601格式("%Y-%m-%d")。

但最佳做法是:

  1. 从CSV
  2. 读取记录
  3. 将数据转换为Python对象(tbl1 = Table('t1', metadata, Column('the_id', Integer, primary_key=True), Column('the_dt', String)) int等)
  4. 在数据库中插入数据。
  5. 转换可以在映射到表的类的构造函数中完成。

    编辑一种"解决方案"

    date

    我创造了一个"假的"使用from sqlalchemy import Table, Column, Integer, MetaData, Date, String from sqlalchemy import create_engine from sqlalchemy.sql import select engine = create_engine('sqlite:///:memory:', echo=True) metadata = MetaData() 类型而非String的表:

    Date

    按原样插入数据:

    fake_tbl1 = Table('t1', metadata,
                      Column('id', Integer, primary_key=True),
                      Column('dt', String))
    
    metadata.create_all(bind=engine)
    

    然后我使用所需的data = [ {'id': 1, 'dt': '2002-01-02'}, {'id': 2, 'dt': '2014-01-15'}, {'id': 3, 'dt': '2005-10-20'} ] stmt_insert = fake_tbl1.insert() with engine.connect() as conn: conn.execute(stmt_insert, data) 字段重新定义同一个表:

    Date

    以下是行选择:

    tbl2 = Table('t1', metadata,
                 Column('id', Integer, primary_key=True),
                 Column('dt', Date),
                 extend_existing=True)
    

    你会得到:

    stmt_select = select([tbl2])
    
    with engine.connect() as conn:
        result = conn.execute(stmt_select)
    
    for row in result:
        print(row)
    

    这适用于您的简单案例,但我不推荐将其作为通用解决方案。