SQLAlchemy插入-AttributeError:对象没有属性“ items”

时间:2018-12-02 16:00:03

标签: python sqlalchemy

我有一个带有datetime列的msyql表。我正在尝试使用python的datetime.datetime.now()并使用sqlalchemy核心插入其中。

from sqlalchemy import MetaData, create_engine, Table, insert 
import datetime 
# from sqlalchemy.sql import func
engine = create_engine('...') 
conn = engine.connect() 

tablemeta = MetaData(bind=engine, reflect=True) 

datetime_test_table = Table('datetime_test', tablemeta, autoload=True, 
        autoload_with=engine) 

ins = insert(datetime_test_table).values(datetime.datetime.now()) 
conn.execute(ins)

我收到以下错误:

AttributeError: 'datetime.datetime' object has no attribute 'items'

我也尝试使用func.now(),但是发生类似的错误。我应该使用哪个对象进行插入?

1 个答案:

答案 0 :(得分:1)

Insert.values()的{​​{3}}起

要将值传递到INSERT语句,可以使用关键字args:

users.insert().values(name="some name")

或者您可以传递一个位置arg:

  

字典,元组或字典或元组列表可以作为单个位置参数传递

users.insert().values({"name": "some name"})  # passing a single dict
users.insert().values((5, "some name"))  # passing a tuple (could be list too).

对于元组/值列表,SQLAlchemy将通过遍历表列和值的集合将其转换为字典。此函数处理.values()the docs)的单个位置arg:

def process_single(p):
    if isinstance(p, (list, tuple)):
        return dict(
            (c.key, pval)
            for c, pval in zip(self.table.c, p)
        )
    else:
        return p  # this is where it is assumed that your datetime object is a dict

因此,据记录,您到.values()的单个位置arg可以是dictlisttuple中的任何一个,在上面的函数中,您可以看到如果您传递值listtuple,它们将被转换为dict。如果您的单个位置arg 不是 listtuple,则在假定它是dict的情况下,将其简单返回(我已在其中注释了该假设是在上面的示例中进行的。

这就是导致您出错的原因。您要将单个位置arg传递给.values()list,而不是tuple,因此SQLAlchemy假定它是dict。但是,它不是dict,而是datetime.datetime实例。错误...

AttributeError: 'datetime.datetime' object has no attribute 'items'

...只是假设SQLAlchemy假设它是dict之后,第一次对参数对象执行dict特定操作。

要解决您的问题,只需以可接受的格式传递值,其中任何一个都可以:

ins = insert(datetime_test_table).values((datetime.datetime.now(),))
ins = insert(datetime_test_table).values([datetime.datetime.now()])
ins = insert(datetime_test_table).values({'dt_col_name': datetime.datetime.now()})
ins = insert(datetime_test_table).values(dt_col_name=datetime.datetime.now())