我有一个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_”参数分配什么才能使这个绑定工作?
答案 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")。
但最佳做法是:
tbl1 = Table('t1', metadata,
Column('the_id', Integer, primary_key=True),
Column('the_dt', String))
,int
等)转换可以在映射到表的类的构造函数中完成。
编辑一种"解决方案"
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)
这适用于您的简单案例,但我不推荐将其作为通用解决方案。