SQLAlchemy - รับรายการตาราง


99

ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับเรื่องนี้ในเอกสารประกอบ แต่ฉันจะรับรายการตารางที่สร้างใน SQLAlchemy ได้อย่างไร

ฉันใช้วิธีการคลาสเพื่อสร้างตาราง

คำตอบ:


89

ตารางทั้งหมดถูกรวบรวมในtablesแอตทริบิวต์ของวัตถุ SQLAlchemy MetaData ในการรับรายชื่อของตารางเหล่านั้น:

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

หากคุณใช้ส่วนขยายที่เปิดเผยแสดงว่าคุณอาจไม่ได้จัดการข้อมูลเมตาด้วยตัวเอง โชคดีที่ข้อมูลเมตายังคงแสดงอยู่บนคลาสพื้นฐาน

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

หากคุณกำลังพยายามค้นหาว่าตารางใดบ้างที่มีอยู่ในฐานข้อมูลของคุณแม้กระทั่งในตารางที่คุณยังไม่ได้บอก SQLAlchemy คุณก็สามารถใช้การสะท้อนตารางได้ จากนั้น SQLAlchemy จะตรวจสอบฐานข้อมูลและอัปเดตข้อมูลเมตาพร้อมกับตารางที่หายไปทั้งหมด

>>> metadata.reflect(engine)

สำหรับ Postgres หากคุณมีหลายสคีมาคุณจะต้องวนลูปผ่านสคีมาทั้งหมดในเอ็นจิ้น:

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
เลิกใช้งานตั้งแต่เวอร์ชัน 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")
Java Xu

@XuJiawan: ฉันไม่แน่ใจว่าสิ่งไหนเลิกใช้ที่นี่ฉันไม่แน่ใจว่าจะแนะนำวิธีไหนถ้าไม่ใช่sqlalchemy.MetaData.reflect()?
SingleNegationElimination

@IfLoop: ผมพบว่ามันมาจากเอกสาร sqlalchemy
Java Xu

1
@XuJiawan: ลิงก์แสดงให้เห็นว่าreflect อาร์กิวเมนต์ไปยังแฟล็MetaData.__init__กบูลีนถูกเลิกใช้เพื่อสนับสนุนการใช้MetaData.reflect()งานเหมือนกับที่ฉันได้แสดงไว้ในคำตอบของฉัน
SingleNegationElimination

2
@IfLoop: เสียใจมากเกี่ยวกับภาษาอังกฤษของฉันไม่ดี คำตอบของคุณถูกต้องและฉันได้เพิ่มขึ้นแล้ว ฉันเพิ่มความคิดเห็นนั้นเพียงเพื่อให้ผู้คนสังเกตเห็นว่าหากพวกเขาใช้เวอร์ชัน <0.8 พวกเขาอาจไม่ใช้MetaData.reflect()วิธีนี้ และยังแสดงความคิดเห็นสำหรับคนอื่นที่อาจมีปัญหาเดียวกันที่เกิดจากการประกาศเครื่องยนต์
Java 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'(สแต็กที่ถูกตัดทอน)
Darshan Chaudhary

สิ่งนี้ใช้ได้กับFlask-SQLAlchemyเนื่องจากมีการเข้าถึงเครื่องยนต์โดยตรงผ่านทางเช่นDB.engine.table_names()หรือชื่อของตัวแปรฐานข้อมูลคืออะไร
colidyre

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

3
นี่คือคำตอบที่ถูกต้องซึ่งใช้ได้กับเดือนพฤศจิกายน 2018
Austin Mackillop

หากไม่ได้ผลเป็นไปได้มากว่าเครื่องยนต์ไม่สามารถเชื่อมต่อได้อย่างถูกต้อง (ดังนั้นจึงเป็นปัญหาในบรรทัดที่ 2) แต่คุณจะไม่ได้รับข้อความแสดงข้อผิดพลาดจนกว่าคุณจะเรียกใช้engine.table_names()
grofte

ใช้คำตอบนี้คน
Manakin

เยี่ยมมาก! เรียบง่ายและทำงานได้ดี
Soubinan


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

มันดำเนินการและส่งคืนตารางทั้งหมด

ปรับปรุง:

Postgres:

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

3
นี่ไม่ใช่การข้ามแพลตฟอร์ม มันจะใช้ได้กับ mysql เท่านั้นมันจะไม่ทำงานกับเอ็นจิ้นฐานข้อมูลอื่น ๆ
Edward Betts

@EdwardBetts คุณพูดถูกเอนจิ้น db ที่คุณสงสัยเกี่ยวกับอะไร?
jmunsch

OP ขอ postgres ไม่ใช่ sql
o elhajoui

5

วัตถุข้อมูลเมตาที่คุณสร้างตารางด้วยนั้นมีอยู่ในพจนานุกรม

metadata.tables.keys()

4

ฉันกำลังแก้ปัญหาเดียวกันและพบโพสต์นี้ หลังจากลองรันฉันขอแนะนำให้ใช้ด้านล่างเพื่อแสดงรายการตารางทั้งหมด: (กล่าวถึงโดย zerocog)

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" มี Dict สำหรับชื่อตารางและวัตถุ Table ซึ่งจะเป็นประโยชน์สำหรับการสืบค้นด่วน


นี้! โดยไม่ต้อง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.