मुझे इस बारे में कोई जानकारी दस्तावेज में नहीं मिली, लेकिन मैं SQLAlchemy में बनाई गई तालिकाओं की सूची कैसे प्राप्त कर सकता हूं?
मैंने टेबल बनाने के लिए क्लास विधि का उपयोग किया।
मुझे इस बारे में कोई जानकारी दस्तावेज में नहीं मिली, लेकिन मैं SQLAlchemy में बनाई गई तालिकाओं की सूची कैसे प्राप्त कर सकता हूं?
मैंने टेबल बनाने के लिए क्लास विधि का उपयोग किया।
जवाबों:
सभी तालिकाएँ tables
SQLAlchemy मेटाडेटा ऑब्जेक्ट की विशेषता में एकत्र की जाती हैं । उन तालिकाओं के नामों की सूची प्राप्त करने के लिए:
>>> 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)
sqlalchemy.MetaData.reflect()
?
reflect
तर्क करने के लिए MetaData.__init__
, एक बूलियन ध्वज, अब मान्य नहीं है पक्ष में उपयोग करने का MetaData.reflect()
, बिल्कुल के रूप में मैं अपने जवाब में पता चला है।
MetaData.reflect()
इस तरह से विधि का उपयोग नहीं कर सकते हैं । और यह भी किसी और के लिए टिप्पणी करें जो इंजन घोषणा के कारण एक ही समस्या हो सकती है।
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'
(ढेर कर दिया गया)
DB.engine.table_names()
है।
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
अजगर दुभाषिया के भीतर db.engine.table_names () का उपयोग करें
$ python
>>> from myapp import db
>>> db.engine.table_names()
मैं कुछ इस तरह की तलाश में था:
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')
मैं उसी समस्या को हल कर रहा हूं और इस पोस्ट को पाया। कुछ प्रयास चलाने के बाद, मैं सभी तालिकाओं को सूचीबद्ध करने के लिए नीचे उपयोग करने का सुझाव दूंगा: (ज़ीरोकॉग द्वारा उल्लिखित)
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
काम नहीं करेगा
एक बार में सभी तालिकाओं को प्रतिबिंबित करने से आप छिपे हुए टेबल नामों को भी पुनः प्राप्त कर सकते हैं। मैंने कुछ अस्थायी टेबल बनाए और उन्होंने साथ दिखाया
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
संदर्भ http://docs.sqlalchemy.org/en/latest/core/reflection.html
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
बजाय"mysql://user:password@host"
और का उपयोग करेंengine.execute("use db_name")
।