अच्छी तरह से इस पर जाने के लिए कुछ तरीके है और उस पर कैसे निर्भर करता है आपके ऐप संरचित है।
meta = MetaData(schema="client1")
तरह से अपने अनुप्रयोग चलाता पूरे आवेदन के भीतर एक समय में एक "ग्राहक" है, तो आप काम हो गया: यहाँ सबसे बुनियादी तरीका है।
लेकिन इसके साथ क्या गलत हो सकता है, उस मेटाडेटा की प्रत्येक तालिका उस स्कीमा पर है। यदि आप एक आवेदन को एक साथ कई ग्राहकों का समर्थन करना चाहते हैं (आमतौर पर "बहुमुखी" का अर्थ क्या है), यह अनावश्यक होगा क्योंकि आपको मेटाडेटा की प्रतिलिपि बनाना होगा और प्रत्येक क्लाइंट के लिए सभी मैपिंग को डुप्लिकेट करना होगा।
client1_foo = Client1Foo()
और उस मामले में आप "इकाई के साथ काम करेंगे: इस दृष्टिकोण से किया जा सकता है, अगर तुम सच में करना चाहते हैं, जिस तरह से यह काम करता है आप की तरह एक विशेष मैप किया वर्ग के साथ प्रत्येक ग्राहक का उपयोग होता है sometable.tometadata()
के साथ http://www.sqlalchemy.org/trac/wiki/UsageRecipes/EntityName पर नुस्खा "(http://docs.sqlalchemy.org/en/latest/core/metadata.html#sqlalchemy.schema.Table.tometadata देखें)।
तो मान लें कि जिस तरह से यह वास्तव में काम करता है वह ऐप के भीतर कई क्लाइंट है, लेकिन प्रति थ्रेड में केवल एक ही समय में।
# start request
# new session
sess = Session()
# set the search path
sess.execute("SET search_path TO client1")
# do stuff with session
# close it. if you're using connection pooling, the
# search path is still set up there, so you might want to
# revert it first
sess.close()
अंतिम दृष्टिकोण @compiles एक्सटेंशन का उपयोग कर रहना संकलक ओवरराइड करने के लिए किया जाएगा: ठीक है वास्तव में, ऐसा करने के लिए है कि PostgreSQL में सबसे आसान तरीका खोज पथ सेट करने के लिए जब आप एक कनेक्शन के साथ काम शुरू किया जाएगा बयानों के भीतर "स्कीमा" नाम। यह करने योग्य है, लेकिन मुश्किल होगा क्योंकि हर जगह "टेबल" उत्पन्न होने के लिए लगातार हुक नहीं है। आपकी सबसे अच्छी शर्त शायद प्रत्येक अनुरोध पर खोज पथ सेट कर रही है।
धन्यवाद! मैं कुछ चीजों की कोशिश करूंगा और फिर देखें कि कौन सा सबसे अच्छा काम करता है और वापस रिपोर्ट करता है लेकिन मुझे लगता है कि रास्ता जाने का रास्ता है। – eleddy
@zzzeek मेरे पास इसका दर्पण प्रश्न है, लेकिन अलेम्बिक के लिए, वास्तव में आपके इनपुट का उपयोग कर सकता है: http://stackoverflow.com/questions/21109218/alembic-support-for-multiple-postgres-schemas – dtheodor
संयोग से, मैं करने में कामयाब रहा यह घोषणात्मक वाक्यविन्यास के लिए: '' base = declarative_base(); Base.metadata.schema = 'ebay'''। हालांकि, शायद एक बेहतर तरीका है। –