ON DUPLICATE KEY UPDATE
posting versi-1.2 untuk MySQL
Fungsionalitas ini sekarang dibangun ke dalam SQLAlchemy untuk MySQL saja. jawaban somada141 di bawah ini memiliki solusi terbaik:https://stackoverflow.com/a/48373874/319066
ON DUPLICATE KEY UPDATE
dalam pernyataan SQL
Jika Anda ingin SQL yang dihasilkan benar-benar menyertakan ON DUPLICATE KEY UPDATE
, cara paling sederhana melibatkan penggunaan @compiles
dekorator.
Kode (ditautkan dari utas bagus tentang subjek di reddit ) untuk contoh dapat ditemukan di github :
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import Insert
@compiles(Insert)
def append_string(insert, compiler, **kw):
s = compiler.visit_insert(insert, **kw)
if 'append_string' in insert.kwargs:
return s + " " + insert.kwargs['append_string']
return s
my_connection.execute(my_table.insert(append_string = 'ON DUPLICATE KEY UPDATE foo=foo'), my_values)
Tetapi perhatikan bahwa dalam pendekatan ini, Anda harus membuat append_string secara manual. Anda mungkin dapat mengubah fungsi append_string sehingga secara otomatis mengubah string sisipan menjadi sisipan dengan string 'ON DUPLICATE KEY UPDATE', tetapi saya tidak akan melakukannya di sini karena malas.
ON DUPLICATE KEY UPDATE
fungsionalitas dalam ORM
SQLAlchemy tidak menyediakan antarmuka untuk ON DUPLICATE KEY UPDATE
atau MERGE
atau fungsi serupa lainnya di lapisan ORM-nya. Namun demikian, ia memiliki session.merge()
fungsi yang dapat mereplikasi fungsi hanya jika kunci yang dimaksud adalah kunci utama .
session.merge(ModelObject)
pertama-tama memeriksa apakah ada baris dengan nilai kunci utama yang sama dengan mengirimkan SELECT
kueri (atau dengan mencarinya secara lokal). Jika ya, itu menetapkan tanda di suatu tempat yang menunjukkan bahwa ModelObject sudah ada di database, dan SQLAlchemy harus menggunakan UPDATE
pertanyaan. Perhatikan bahwa penggabungan sedikit lebih rumit dari ini, tetapi ini mereplikasi fungsionalitas dengan baik dengan kunci utama.
Tetapi bagaimana jika Anda ingin ON DUPLICATE KEY UPDATE
fungsionalitas dengan kunci non-utama (misalnya, kunci unik lainnya)? Sayangnya, SQLAlchemy tidak memiliki fungsi seperti itu. Sebagai gantinya, Anda harus membuat sesuatu yang menyerupai get_or_create()
Django's . Jawaban StackOverflow lain mencakupnya
, dan saya hanya akan menempelkan versi yang sudah dimodifikasi dan berfungsi di sini untuk kenyamanan.
def get_or_create(session, model, defaults=None, **kwargs):
instance = session.query(model).filter_by(**kwargs).first()
if instance:
return instance
else:
params = dict((k, v) for k, v in kwargs.iteritems() if not isinstance(v, ClauseElement))
if defaults:
params.update(defaults)
instance = model(**params)
return instance