Sqlalchemy Insert - AttributeError: у объекта нет атрибута 'items' - PullRequest
0 голосов
/ 02 декабря 2018

У меня есть таблица msyql со столбцом datetime.Я пытаюсь использовать 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 голосов
/ 03 декабря 2018

С документов на 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...