مخططات مختلفة تحتوي على أسماء الجداول نفسها

StackOverflow https://stackoverflow.com/questions/20353840

  •  25-08-2022
  •  | 
  •  

سؤال

أجد نفسي مع مشروع Django التعامل مع فئتين متميزتين تم تعيينهما على اسم جدول مماثل:

class BarA(models.Model):
[...]
class Meta:
    db_table = 'bar' # doesn't specify any schema

class BarB(models.Model):
[...]
class Meta:
    db_table = u'foo"."bar'

يستخدم المشروع قاعدة بيانات تحتوي على مخططين: public و foo.

إن الطريقة التي يتم بها تمثيل هذا التطبيق ونشرها تجعل الأمور أكثر إرباكًا: في بعض الخوادم ، يتصل Django بقاعدة البيانات مع المستخدم "John" ، وليس عضوًا في أي دور ، ولكن على الخوادم الأخرى ، يتصل بالمستخدم "Eric" ، عضو في A foo وظيفة.

سؤالان هنا:

  1. إذا فئة التعريف في Django لا يذكر أي مخطط محدد ، كيف تقرر Postgres الجدول الذي سيعمل معه ؟ حتى الآن ، يبدو أن المستخدم إريك سيضغط دائمًا على foo.bar الجدول ، وليس public.bar واحد ، بغض النظر عن الطبقة التي تسمى. مع المستخدم "جون" ، أنا أستخدم فقط BarA الفصل ويضرب بشكل صحيح public.bar.
  2. لا يبدو أن Django يتعامل مع المخططات ؛ هو هذا الحل تعتبر ممارسة جيدة لهذا النوع من الحالة (يرجى ملاحظة أنه لا يمكنني إعادة تسمية الجداول الحالية)؟
هل كانت مفيدة؟

المحلول

في postgres search_path عامل حدد الأولوية لاختيار المخطط للجدول:

Search_Path (سلسلة)
يحدد هذا المتغير الترتيب الذي يتم فيه البحث عن المخططات عندما يتم الرجوع إلى كائن (الجدول ، نوع البيانات ، الدالة ، إلخ) باسم بسيط بدون مخطط محدد. عندما تكون هناك كائنات ذات أسماء متطابقة في مخططات مختلفة ، يتم استخدام الأسماء الموجودة أولاً في مسار البحث.
[...]
يمكن فحص القيمة الفعالة الحالية لمسار البحث عبر وظيفة SQL Current_schemas.

طريقة سريعة للقيام بذلك:

SELECT current_schemas(True);

يمكنك العثور على تفاصيل حول كيفية الإدارة search_path في القسم 5.7.3. في هذه المقالة: http://www.postgresql.org/docs/current/static/ddl-schemas.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top