python - SQLalchemy 插入 - AttributeError : object has no attribute 'items'

标签 python sqlalchemy

我有一个带有日期时间列的 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' 对象没有属性 'items'

我也尝试使用 func.now(),但出现了类似的错误。我应该使用什么对象来进行插入?

最佳答案

来自 the docsInsert.values()

要将值传递给 INSERT 语句,您可以使用关键字参数:

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

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

a dictionary, tuple, or list of dictionaries or tuples can be passed as a single positional argument

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() ( permalink ) 的函数:

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() 的单个位置参数可以是 dictlist 中的任何一个tuple 在上面的函数中,你可以看到,如果你传递一个 listtuple 值,它们会被转换成一个 dict。如果您的单个位置参数 不是 listtuple,它会被简单地返回,假设它是一个 dict(我已经在上面的示例中注释了该假设的位置)。

这就是导致您的错误的原因。您将一个位置参数传递给 .values(),它既不是 list 也不是 tuple,因此 SQLAlchemy 假定它是 字典。但是,它不是 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())

关于python - SQLalchemy 插入 - AttributeError : object has no attribute 'items' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53582003/

相关文章:

python - 如何根据日期和两列的组合将缺失的行添加到 pandas DataFrame 中?

python - "pwd"通过 python 子进程运行时在 Windows 机器上给出路径

python - 包含具有游程长度和频率约束的二进制值的 python 列表的伪随机生成

python - 如何将 SqlAlchemy 连接查询序列化为 JSON?

python - 如何在 Google Colab 上安装 auto-sklearn?

validation - 如何删除 wtforms 中 id 字段的验证器

python - 用于添加索引的 SQLAlchemy/Alembic 原始 SQL

python-2.7 - 如何在 SQL-Alchemy 的帮助下获取数字之间的条目

python - 检查不存在的可选表

python 通过 telnet session 在行尾不断报告 "invalid syntax"