2013-10-22 6 views
8

मैं एमएस एसक्यूएल सर्वर चला रहा हूं और विभिन्न डेटाबेस (उसी सर्वर पर) में स्थित दो तालिकाओं के बीच JOIN निष्पादित करने का प्रयास कर रहा हूं। यदि मैं pyodbc (डेटाबेस निर्दिष्ट किए बिना) का उपयोग कर सर्वर से कनेक्ट करता हूं, तो निम्न कच्चे SQL ठीक काम करता है।SQLAlchemy: एक ही सत्र में एकाधिक डेटाबेस (उसी सर्वर पर)?

SELECT * FROM DatabaseA.dbo.tableA tblA 
     INNER JOIN DatabaseB.dbo.tableB tblB 
     ON tblA.id = tblB.id 

दुर्भाग्य से, मैं सिर्फ SQLAlchemy का उपयोग कर काम करने के लिए अनुरूप प्राप्त नहीं कर पा रहे। मैं इस विषय में कुछ स्थानों में पर छुआ देखा है:

सबसे अलग इंजन/सत्र का उपयोग करने की सलाह देते हैं, लेकिन मैं महत्वपूर्ण डेटाबेस के बीच जुड़ने की आवश्यकता है, इसलिए मुझे नहीं लगता कि यह दृष्टिकोण सहायक होगा। एक अन्य सामान्य सुझाव schema पैरामीटर का उपयोग करना है, लेकिन यह मेरे लिए काम नहीं कर रहा है। उदाहरण के लिए निम्नलिखित काम नहीं करता है।

engine = create_engine('mssql+pyodbc://...') #Does not specify database 

metadataA = MetaData(bind=engine, schema='DatabaseA.dbo', reflect=True) 
tableA = Table('tableA', metadataA, autoload=True) 

metadataB = MetaData(bind=engine, schema='DatabaseB.dbo', reflect=True) 
tableB = Table('tableB', metadataB, autoload=True) 

मैं भी varients जहां schema='DatabaseA' और schema='dbo' कोशिश की है। सभी मामलों में SQLAlchemy दोनों तालिका ए और बी के लिए NoSuchTableError फेंकता है कोई विचार?

उत्तर

0

मैं यहां दो तरह के परीक्षण चलाने में सक्षम हूं, दो रिमोट डेटाबेस से प्रतिबिंबित करता हूं, और यह ठीक काम करता है।

  1. हाल ही में एक SQLAlchemy (0.8.3 कम से कम अनुशंसित) का उपयोग करते हुए?

  2. "echo = 'डीबग' चालू करें" - यह कौन सी टेबल ढूंढ रही है?

  3. सभी को प्रतिबिंबित करने के बाद, metadataA.tables metadataB.tables में क्या मौजूद है?

  4. यहां पर ठीक है SQL सर्वर पर क्या है? (उदाहरण के लिए टेबल ए)। इस तरह के एक केस संवेदनशील नाम का उपयोग करने के लिए इसे उद्धृत किया जाएगा।

1

यदि आप किसी डेटाबेस में समानार्थी बना सकते हैं, तो आप अपनी क्वेरी को उस डेटाबेस में स्थानीय रख सकते हैं।

USE DatabaseB; 
GO 
CREATE SYNONYM dbo.DbA_TblA FOR DatabaseA.dbo.tableA; 
GO 

आपकी क्वेरी तो हो जाता है:

SELECT * FROM dbo.DbA_TblA tblA 
    INNER JOIN dbo.tableB tblB 
    ON tblA.id = tblB.id 
संबंधित मुद्दे