এসকিউএএলএলকেমি - সারণীর তালিকা পাওয়া


99

ডকুমেন্টেশনে এ সম্পর্কিত কোনও তথ্য আমি খুঁজে পাইনি, তবে কীভাবে আমি এসকিউএলএলচেমিতে তৈরি টেবিলগুলির একটি তালিকা পেতে পারি?

আমি টেবিলগুলি তৈরি করতে ক্লাস পদ্ধতিটি ব্যবহার করেছি।

উত্তর:


90

সমস্ত সারণী tablesএসকিউএএলএলএকচেমি মেটাডেটা অবজেক্টের বৈশিষ্ট্যে সংগ্রহ করা হয় । এই টেবিলগুলির নামের একটি তালিকা পেতে:

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

আপনি যদি ঘোষণামূলক এক্সটেনশন ব্যবহার করছেন তবে সম্ভবত আপনি নিজেই মেটাটাটা পরিচালনা করছেন না। ভাগ্যক্রমে, মেটাডেটা এখনও বেসক্লাসে উপস্থিত রয়েছে,

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

আপনি যদি আপনার ডাটাবেসে কী সারণী উপস্থিত রয়েছে তা সন্ধান করার চেষ্টা করছেন, আপনি এমনকি এসকিউএলএলচেমিকে এখনও জানাননি, তবে আপনি টেবিলের প্রতিচ্ছবি ব্যবহার করতে পারেন। এসকিউএলএলচেমি এরপরে ডাটাবেসটি পরিদর্শন করবে এবং হারিয়ে যাওয়া সমস্ত টেবিলের সাথে মেটাডেটা আপডেট করবে।

>>> 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)

8
সংস্করণ ০.৮ থেকে অবহেলিত: দয়া করে sqlalchemy.schema.MetaData.reflect () পদ্ধতিটি ব্যবহার করুন। এবং খেয়াল করুন, ব্যবহার engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')বদলে "mysql://user:password@host"এবং engine.execute("use db_name")
জাভা Xu

@ শুজিয়াওয়ান: আমি নিশ্চিত নই যে এখানে কোন জিনিসটি অবমূল্যায়ন করা হয়েছে, আমি নিশ্চিত নই যে কোন পদ্ধতিটি যদি তা না করে তবে আমি প্রস্তাব দিচ্ছি sqlalchemy.MetaData.reflect()?
সিঙ্গেলাইজেশন ইলিমিনেশন

@ ইফলুপ: আমি এটি স্কেলচেমি নথি থেকে পেয়েছি ।
জাভা Xu

4
@XuJiawan: লিঙ্ক দাড়ায় যে reflect যুক্তি করতে MetaData.__init__, একটি বুলিয়ান ফ্ল্যাগে, অবচিত পক্ষে ব্যবহারের MetaData.reflect(), ঠিক যেমন আমি আমার উত্তর দেখিয়েছে।
সিঙ্গেলাইজেশন ইলিমিনেশন

4
@ ইফলুপ: আমার দুর্বল ইংরেজি সম্পর্কে খুব দুঃখিত। আপনার উত্তর হুবহু সঠিক এবং আমি এটি আপ করেছি। আমি এই মন্তব্যটি যুক্ত করেছি যাতে লোকেরা লক্ষ্য করতে পারেন যে তারা যদি সংস্করণ <0.8 ব্যবহার করে তবে তারা MetaData.reflect()এই পদ্ধতিটি ব্যবহার করতে পারে না । এবং এটি অন্য কারও জন্য মন্তব্য করুন যার ইঞ্জিন ঘোষণার কারণে একই সমস্যা হতে পারে।
জাভা Xu

82

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() বা ডাটাবেস ভেরিয়েবলের নাম যাই হোক না কেন।
কলিডিয়ার

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

4
এই সঠিক উত্তর যে নভেম্বর 2018 হিসাবে কাজ করে
অস্টিন Mackillop

যদি এটি কাজ না করে তবে সম্ভবত সম্ভবত ইঞ্জিন সঠিকভাবে সংযোগ করতে পারে না (সুতরাং লাইন 2 এ সমস্যা) তবে আপনি engine.table_names()
চালা

এই উত্তর মানুষ ব্যবহার করুন।
মানাকিন

দুর্দান্ত! সহজ এবং এত ভাল কাজ
সৌখিনান

13

পাইথন ইন্টারপ্রেটারের মধ্যে db.engine.table_names () ব্যবহার করুন

$ python
>>> from myapp import db
>>> db.engine.table_names()

10

আমি ভালো কিছু খুঁজছিলাম:

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()

এটি কার্যকর করে এবং সমস্ত সারণী প্রদান করে।

হালনাগাদ:

পোস্টগ্রিস:

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

4
এটি ক্রস প্ল্যাটফর্ম নয়। এটি কেবল মাইএসকিএল নিয়ে কাজ করবে, এটি অন্যান্য ডাটাবেস ইঞ্জিনগুলির সাথে কাজ করবে না।
এডওয়ার্ড বেটস

আপনি কি ঠিক বলেছেন অ্যাডওয়ার্ডবেটস আপনি কী ডিবি ইঞ্জিন নিয়ে ভাবছিলেন?
জমুনশ


5

আপনি মেটাডেটা অবজেক্টের সাহায্যে সারণী তৈরি করেছেন সেটি অভিধানে রয়েছে।

metadata.tables.keys()

4

আমি একই সমস্যা সমাধান করছি এবং এই পোস্টটি খুঁজে পেয়েছি। কিছুক্ষণ চালানোর চেষ্টা করার পরে, আমি সমস্ত সারণী তালিকাবদ্ধ করতে নীচে ব্যবহারের পরামর্শ দেব: (জিরোকগ দ্বারা উল্লিখিত)

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

এটি সরাসরি টেবিল পরিচালনা করার জন্য দরকারী এবং আমার মনে হয় এটির প্রস্তাবিত is

টেবিলের নাম পেতে নীচের কোডটি ব্যবহার করুন:

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

"metadata.tables" সারণির নাম এবং সারণী অবজেক্টের জন্য একটি ডিক্ট সরবরাহ করে। যা দ্রুত জিজ্ঞাসার জন্যও কার্যকর হবে।


এই! ছাড়া reflect, metadata.sorted_tablesকাজ করবে না
কে

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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.