tortoise-orm icon indicating copy to clipboard operation
tortoise-orm copied to clipboard

Corrupt sql generated when bulk_create method is configured with on_conflict parameter

Open zzl221000 opened this issue 1 year ago • 1 comments

Describe the bug

In the sqlite engine, configuring update_fields will configure on_conflict for self.insert_query and self.insert_query_all, resulting in duplicate on conflict fields.

'INSERT INTO "fileevent" ("id","tn","date","url","status","create_at") VALUES (?,?,?,?,?,?) ON CONFLICT ("id", "id") DO UPDATE SET "url"=EXCLUDED."url","url"=EXCLUDED."url"'

To Reproduce sqlite3 and use bulk api

Expected behavior

'INSERT INTO "fileevent" ("id","tn","date","url","status","create_at") VALUES (?,?,?,?,?,?) ON CONFLICT ("id") DO UPDATE SET "url"=EXCLUDED."url","url"=EXCLUDED."url"'

zzl221000 avatar Mar 12 '24 10:03 zzl221000

Reproducible on 0.21.6:

from tortoise import Tortoise, models, fields
import asyncio


class Meta(models.Model):
    key = fields.TextField(primary_key=True)
    value = fields.IntField()


async def main():
    await Tortoise.init(
        db_url='sqlite://:memory:',
        modules={'models': ['__main__']},
    )
    await Tortoise.generate_schemas()

    data = {'a': 1, 'b': 2, 'c': 3}

    await Meta.bulk_create(
        objects=(Meta(key=k, value=v) for k, v in data.items()),
        on_conflict=('key',),
        update_fields=('value',),
    )

asyncio.run(main())

droserasprout avatar Sep 05 '24 22:09 droserasprout