С документов на Insert.values()
Чтобы передать значения в оператор INSERT
, вы можете использовать ключевые слова args:
users.insert().values(name="some name")
Или вы можетепередать один позиционный аргумент:
словарь, кортеж или список словарей или кортежей может быть передан как один позиционный аргумент
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()
( постоянная ссылка ):
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()
может быть любым изdict
, list
или tuple
и в приведенной выше функции вы можете видеть, что если вы передаете значения list
или tuple
, они конвертируются в dict
.Если ваш единственный позиционный аргумент не является a list
или tuple
, он просто возвращается в предположении, что это dict
(я прокомментировал, где это предположение сделано в примеревыше).
Это то, что приводит к вашей ошибке.Вы передаете один позиционный аргумент .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())