Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQLAlchemy PADA PEMBARUAN KUNCI DUPLICATE

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah mungkin untuk GROUP BY beberapa kolom menggunakan MySQL?

  2. Apakah mungkin untuk mengeksekusi string di MySQL?

  3. 2 Cara Mengembalikan Baris yang Mengandung Karakter Alfanumerik di MySQL

  4. kesalahan sintaks readyStatement

  5. Cara Mendapatkan row_number di MySQL