Django 1.6+ . के लिए एक समाधान मौजूद है (1.11 सहित) MySQL . के लिए और स्क्लाइट बैकएंड, विकल्प ForeignKey द्वारा। db_constraint =झूठा
और स्पष्ट Meta.db_table
. यदि डेटाबेस का नाम और तालिका का नाम उद्धृत है ' `' (MySQL के लिए) या ' "' (अन्य डीबी के लिए) द्वारा, उदाहरण के लिए db_table = '"db2"."table2"'
) फिर इसे अधिक उद्धृत नहीं किया जाता है और बिंदु उद्धृत से बाहर हो जाता है। मान्य प्रश्न Django ORM द्वारा संकलित किए गए हैं। एक बेहतर समान समाधान है db_table = 'db2"."table2'
(जो न केवल जुड़ने की अनुमति देता है बल्कि यह एक मुद्दे से डीबी बाधा प्रवास को पार करने के करीब भी है)
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
क्वेरी सेट:
>>> 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'
वह क्वेरी पार्सिंग सभी db बैकएंड . द्वारा समर्थित है Django में, हालांकि अन्य आवश्यक कदमों पर बैकएंड द्वारा व्यक्तिगत रूप से चर्चा की जानी चाहिए। मैं अधिक सामान्य रूप से उत्तर देने का प्रयास कर रहा हूं क्योंकि मुझे एक समान महत्वपूर्ण प्रश्न ।
माइग्रेशन के लिए विकल्प 'db_constraint' आवश्यक है, क्योंकि Django संदर्भ अखंडता बाधा नहीं बना सकता हैADD foreign key table1(fk_id) REFERENCES db2.table2(id)
,
लेकिन यह मैन्युअल रूप से बनाया जा सकता है
MySQL के लिए।
विशेष बैकएंड के लिए एक प्रश्न यह है कि क्या रन-टाइम पर किसी अन्य डेटाबेस को डिफ़ॉल्ट से जोड़ा जा सकता है और यदि एक क्रॉस डेटाबेस विदेशी कुंजी समर्थित है। ये मॉडल भी लिखने योग्य हैं। अप्रत्यक्ष रूप से जुड़े डेटाबेस को managed=False
. के साथ लीगेसी डेटाबेस के रूप में उपयोग किया जाना चाहिए (क्योंकि केवल एक टेबल django_migrations
माइग्रेशन के लिए ट्रैकिंग केवल सीधे जुड़े डेटाबेस में बनाई जाती है। इस तालिका को एक ही डेटाबेस में केवल तालिकाओं का वर्णन करना चाहिए।) हालांकि विदेशी कुंजी के लिए इंडेक्स स्वचालित रूप से प्रबंधित पक्ष पर बनाए जा सकते हैं यदि डेटाबेस सिस्टम ऐसे इंडेक्स का समर्थन करता है।
स्क्लाइट3 :इसे रन-टाइम पर किसी अन्य डिफ़ॉल्ट sqlite3 डेटाबेस से जोड़ना होगा (उत्तर SQLite - आप विभिन्न डेटाबेस से तालिकाओं में कैसे शामिल होते हैं ), सिग्नल द्वारा सर्वोत्तम रूप से 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)
फिर इसे निश्चित रूप से डेटाबेस राउटर और सामान्य django...ForeignKey
की आवश्यकता नहीं है db_constraint=False के साथ प्रयोग किया जा सकता है। एक लाभ यह है कि "db_table" आवश्यक नहीं है यदि तालिका नाम डेटाबेस के बीच अद्वितीय हैं।
MySQL . में विभिन्न डेटाबेस के बीच विदेशी कुंजियां आसान हैं। SELECT, INSERT, DELETE जैसे सभी कमांड किसी भी डेटाबेस नाम को पहले अटैच किए बिना सपोर्ट करते हैं।
यह प्रश्न विरासत डेटाबेस के बारे में था। हालांकि मेरे पास माइग्रेशन के साथ कुछ दिलचस्प परिणाम भी हैं।