簡體   English   中英

在 SQLAlchemy 批量更新 python 數據庫.Database

[英]Bulk update in SQLAlchemy with python databases.Database

我有 postgres 數據方案:

table_tools = sqlalchemy.Table(
    settings.sql_tool_table_name,
    metadata,
    sqlalchemy.Column('id', UUID,
                      primary_key=True,
                      server_default=sqlalchemy.text(
                          "uuid_generate_v4()"),
                      index=True),
    Column('article', sqlalchemy.String(50), nullable=True),
    Column('title', sqlalchemy.String, nullable=False),
    Column('base_title', sqlalchemy.String, nullable=False,
           index=True),
    Column('maker', sqlalchemy.String(50), nullable=False),
    Column('description', sqlalchemy.String, nullable=True),
    Column('price', sqlalchemy.Float),
    Column('currency', sqlalchemy.String(5)),
    Column('created_at', sqlalchemy.DateTime(timezone=True),
           default=func.now()),
    Column('updated_at',
           sqlalchemy.DateTime(timezone=True), default=func.now(),
           onupdate=func.now()),
    UniqueConstraint('base_title', 'maker',
                     name='unique_base_title_maker')
)

我在這個項目中使用迂腐的過渡模型。 我想使用 bulk_update 方法按 id 更新數據,如下所示:

async def update_tool_bulk(self, tools: list[ToolIn]):
    tools_load = []
    for tool in tools:
        tool_db: Record = await self.get_tool(tool.title, tool.maker)
        tool_id: UUID = dict(**tool_db).get('id')
        tool_upd = ToolInFull(**tool.dict())
        tools_load.append({'_id': tool_id} | tool_upd.dict())
    self.table_tools.update()
    query = self.table_tools.update(
        self.table_tools.columns.id == bindparam('_id')).values({
            'article': bindparam('article'),
            'title': bindparam('title'),
            'base_title': bindparam('base_title'),
            'maker': bindparam('maker'),
            'description': bindparam('description'),
            'price': bindparam('price'),
            'currency': bindparam('currency')
        })
    await self.database.execute_many(query=query, values=tools_load)

執行此代碼時,出現錯誤:

未使用的列名:_id

如果我用“id”替換“_id”參數,我會得到一個錯誤:

綁定參數“id”與同名的唯一綁定參數沖突

告訴我,我做錯了什么?

我解決了這個問題 - 有必要轉換為查詢字符串:self.database.execute_many(query=str(query), values=tools_load)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM