SQLAlchemy - तालिकाओं की सूची प्राप्त करना


94

मुझे इस बारे में कोई जानकारी दस्तावेज में नहीं मिली, लेकिन मैं SQLAlchemy में बनाई गई तालिकाओं की सूची कैसे प्राप्त कर सकता हूं?

मैंने टेबल बनाने के लिए क्लास विधि का उपयोग किया।

जवाबों:


86

सभी तालिकाएँ tablesSQLAlchemy मेटाडेटा ऑब्जेक्ट की विशेषता में एकत्र की जाती हैं । उन तालिकाओं के नामों की सूची प्राप्त करने के लिए:

>>> metadata.tables.keys()
['posts', 'comments', 'users']

यदि आप घोषणात्मक विस्तार का उपयोग कर रहे हैं, तो आप शायद स्वयं मेटाडेटा का प्रबंधन नहीं कर रहे हैं। सौभाग्य से, मेटाडेटा अभी भी बेसकेल्स पर मौजूद है,

>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)

यदि आप यह पता लगाने की कोशिश कर रहे हैं कि आपके डेटाबेस में कौन-सी तालिकाएँ मौजूद हैं, यहां तक ​​कि उन लोगों के बीच भी जिन्हें आपने SQLAlchemy के बारे में अभी तक नहीं बताया है, तो आप तालिका प्रतिबिंब का उपयोग कर सकते हैं। SQLAlchemy तब डेटाबेस का निरीक्षण करेगा और सभी अनुपलब्ध तालिकाओं के साथ मेटाडेटा को अपडेट करेगा।

>>> metadata.reflect(engine)

पोस्टग्रेज के लिए, यदि आपके पास कई स्कीमा हैं, तो आपको इंजन के सभी स्कीमाओं को लूप करना होगा:

from sqlalchemy import inspect
inspector = inspect(engine)
schemas = inspector.get_schema_names()

for schema in schemas:
    print("schema: %s" % schema)
    for table_name in inspector.get_table_names(schema=schema):
        for column in inspector.get_columns(table_name, schema=schema):
            print("Column: %s" % column)

7
संस्करण 0.8 से पदावनत: sqlalchemy.schema.MetaData.reflect () विधि का उपयोग करें। और नोटिस, engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')बजाय "mysql://user:password@host"और का उपयोग करें engine.execute("use db_name")
जावा जू

@XuJiawan: मुझे यकीन नहीं है कि यहाँ कौन सी चीज़ को हटा दिया गया है, मुझे यकीन नहीं है कि अगर यह नहीं है तो कौन सा तरीका सुझा रहा हूँ sqlalchemy.MetaData.reflect()?
एकलकरण

@IfLoop: मुझे यह sqlalchemy दस्तावेज़ से मिला ।
जावा जू

1
@XuJiawan: लिंक पता चलता है कि reflect तर्क करने के लिए MetaData.__init__, एक बूलियन ध्वज, अब मान्य नहीं है पक्ष में उपयोग करने का MetaData.reflect(), बिल्कुल के रूप में मैं अपने जवाब में पता चला है।
एकलकरण संस्कार

2
@IfLoop: मेरी खराब अंग्रेजी के बारे में बहुत खेद है। आपका उत्तर बिल्कुल सही है और मैंने इसे छोड़ दिया है। मैंने उस टिप्पणी को केवल लोगों को यह बताने के लिए जोड़ा कि यदि वे संस्करण <0.8 का उपयोग करते हैं, तो वे MetaData.reflect()इस तरह से विधि का उपयोग नहीं कर सकते हैं । और यह भी किसी और के लिए टिप्पणी करें जो इंजन घोषणा के कारण एक ही समस्या हो सकती है।
जावा जू

77

engineतालिका नाम की सूची लाने के लिए एक विधि है ।engine.table_names()


मुझे मिलता है Traceback (most recent call last): File "dedup_jobs.py", line 31, in <module> print(engine.table_names()) File "/Users/darshanchoudhary/.virtualenvs/services/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 2128, in table_names return self.dialect.get_table_names(conn, schema) value = value.replace(self.escape_quote, self.escape_to_quote) AttributeError: 'NoneType' object has no attribute 'replace'(ढेर कर दिया गया)
दर्शन चौधरी

यह फ्लास्क-SQLAlchemy के साथ भी काम करता है , क्योंकि उदाहरण के लिए या डेटाबेस चर का नाम जो भी है के माध्यम से इंजन के लिए सीधी पहुंचDB.engine.table_names() है।
कोलीड्रे

41
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())

3
यह सही उत्तर है जो नवंबर 2018 तक काम करता है।
ऑस्टिन मैकिलोप

अगर यह काम नहीं करता है, तो इसकी सबसे अधिक संभावना है क्योंकि इंजन सही तरीके से कनेक्ट नहीं हो सकता है (इसलिए लाइन 2 में एक समस्या) लेकिन आपको त्रुटि संदेश तब तक नहीं मिलेगा जब तक आप नहीं चलते हैंengine.table_names()
grofte

इस उत्तर का लोग उपयोग करें।
मैनाकिन


11

मैं कुछ इस तरह की तलाश में था:

from sqlalchemy import create_engine
eng = create_engine('mysql+pymysql://root:password@localhost:3306', pool_recycle=3600)
q = eng.execute('SHOW TABLES')

available_tables = q.fetchall()

यह सभी तालिकाओं को निष्पादित और वापस करता है।

अपडेट करें:

postgres:

eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')

3
यह क्रॉस-प्लेटफॉर्म नहीं है। यह केवल mysql के साथ काम करेगा, यह अन्य डेटाबेस इंजनों के साथ काम नहीं करेगा।
एडवर्ड बेट्स

@EdwardBetts आप सही हैं, आप किस db इंजन के बारे में सोच रहे थे?
जमुनाश

ओपी ने
o elhajoui

4

मेटाडेटा ऑब्जेक्ट जिसे आपने टेबल बनाया है, एक शब्दकोश में है।

metadata.tables.keys()

4

मैं उसी समस्या को हल कर रहा हूं और इस पोस्ट को पाया। कुछ प्रयास चलाने के बाद, मैं सभी तालिकाओं को सूचीबद्ध करने के लिए नीचे उपयोग करने का सुझाव दूंगा: (ज़ीरोकॉग द्वारा उल्लिखित)

metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
    print(table)

यह डायरेक्ट टेबल हैंडलिंग के लिए उपयोगी है और मुझे लगता है कि इसकी सिफारिश की गई है।

और तालिका नाम प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग करें:

for table_name in engine.table_names():
    print(table_name)

"metadata.tables" तालिका नाम और टेबल ऑब्जेक्ट के लिए एक डिक्ट प्रदान करता है। जो त्वरित क्वेरी के लिए भी उपयोगी होगा।


यह! बिना reflect, metadata.sorted_tablesकाम नहीं करेगा
Kay

2

एक बार में सभी तालिकाओं को प्रतिबिंबित करने से आप छिपे हुए टेबल नामों को भी पुनः प्राप्त कर सकते हैं। मैंने कुछ अस्थायी टेबल बनाए और उन्होंने साथ दिखाया

meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
    print table

संदर्भ http://docs.sqlalchemy.org/en/latest/core/reflection.html


2

बस यह सरल:

engine.table_names()

यह जाँचने के लिए कि क्या कोई तालिका मौजूद है:

engine.has_table(table_name)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.