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

Django ManyToMany melalui beberapa database

Ada solusi untuk Django 1.6+ (termasuk 1.11) untuk MySQL dan sqlite backend, dengan opsi ForeignKey. db_constraint =Salah dan Meta.db_table explicit eksplisit . Jika nama database dan nama tabel dikutip dengan ' ` ' (untuk MySQL) atau dengan ' " ' (untuk db lain), mis. db_table = '"db2"."table2"' ). Kemudian tidak dikutip lagi dan titiknya tidak dikutip. Kueri yang valid dikompilasi oleh Django ORM. Solusi serupa yang lebih baik adalah db_table = 'db2"."table2' (yang memungkinkan tidak hanya bergabung tetapi juga dengan satu masalah lebih dekat untuk melintasi migrasi kendala db)

db2_name = settings.DATABASES['db2']['NAME']

class Table1(models.Model):
    fk = models.ForeignKey('Table2', on_delete=models.DO_NOTHING, db_constraint=False)

class Table2(models.Model):
    name = models.CharField(max_length=10)
    ....
    class Meta:    
        db_table = '`%s`.`table2`' % db2_name  # for MySQL
        # db_table = '"db2"."table2"'          # for all other backends
        managed = False

Kumpulan kueri:

>>> qs = Table2.objects.all()
>>> str(qs.query)
'SELECT "DB2"."table2"."id" FROM DB2"."table2"'
>>> qs = Table1.objects.filter(fk__name='B')
>>> str(qs.query)
SELECT "app_table1"."id"
    FROM "app_table1"
    INNER JOIN "db2"."app_table2" ON ( "app_table1"."fk_id" = "db2"."app_table2"."id" )
    WHERE "db2"."app_table2"."b" = 'B'

Penguraian kueri tersebut didukung oleh semua backend db di Django, namun langkah-langkah lain yang diperlukan harus didiskusikan satu per satu oleh backend. Saya mencoba menjawab secara lebih umum karena saya menemukan pertanyaan penting serupa .

Opsi 'db_constraint' diperlukan untuk migrasi, karena Django tidak dapat membuat batasan integritas referensi
ADD foreign key table1(fk_id) REFERENCES db2.table2(id) ,
tetapi dapat dibuat secara manual untuk MySQL.

Pertanyaan untuk backend tertentu adalah apakah database lain dapat dihubungkan ke default saat run-time dan jika kunci asing lintas database didukung. Model ini juga dapat ditulis. Basis data yang terhubung secara tidak langsung harus digunakan sebagai basis data lama dengan managed=False (karena hanya satu tabel django_migrations untuk pelacakan migrasi hanya dibuat di database yang terhubung langsung. Tabel ini harus menjelaskan hanya tabel dalam database yang sama.) Namun indeks untuk kunci asing dapat dibuat secara otomatis di sisi yang dikelola jika sistem database mendukung indeks tersebut.

Sqlite3 :Itu harus dilampirkan ke database sqlite3 default lain saat run-time (jawab SQLite - Bagaimana Anda menggabungkan tabel dari database yang berbeda ), paling baik dengan sinyal connection_created :

from django.db.backends.signals import connection_created

def signal_handler(sender, connection, **kwargs):
    if connection.alias == 'default' and connection.vendor == 'sqlite':
        cur = connection.cursor()
        cur.execute("attach '%s' as db2" % db2_name)
        # cur.execute("PRAGMA foreign_keys = ON")  # optional

connection_created.connect(signal_handler)

Maka itu tidak memerlukan router basis data tentu saja dan django...ForeignKey normal dapat digunakan dengan db_constraint=False. Keuntungannya adalah "db_table" tidak diperlukan jika nama tabel unik antar database.

Di MySQL kunci asing antara database yang berbeda mudah. Semua perintah seperti SELECT, INSERT, DELETE mendukung nama database apa pun tanpa melampirkannya sebelumnya.

Pertanyaan ini tentang database warisan. Namun saya memiliki beberapa hasil yang menarik juga dengan migrasi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Produk cartesian MySQL antara dua pernyataan SELECT

  2. Dapatkan semua tindakan dari tiga pengguna terakhir

  3. praktik terbaik sql saya dengan php untuk menghitung baris

  4. Peringatan:mysql_connect():Tidak dapat terhubung ke server MySQL lokal

  5. menemukan produk yang dibeli pelanggan bersama