ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับเรื่องนี้ในเอกสารประกอบ แต่ฉันจะรับรายการตารางที่สร้างใน SQLAlchemy ได้อย่างไร
ฉันใช้วิธีการคลาสเพื่อสร้างตาราง
ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับเรื่องนี้ในเอกสารประกอบ แต่ฉันจะรับรายการตารางที่สร้างใน SQLAlchemy ได้อย่างไร
ฉันใช้วิธีการคลาสเพื่อสร้างตาราง
คำตอบ:
ตารางทั้งหมดถูกรวบรวมใน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)
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()
ภายในตัวแปล python ใช้ 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.tables.keys()
ฉันกำลังแก้ปัญหาเดียวกันและพบโพสต์นี้ หลังจากลองรันฉันขอแนะนำให้ใช้ด้านล่างเพื่อแสดงรายการตารางทั้งหมด: (กล่าวถึงโดย 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
จะไม่ทำงาน
การสะท้อนตารางทั้งหมดในครั้งเดียวช่วยให้คุณสามารถดึงชื่อตารางที่ซ่อนอยู่ได้เช่นกัน ฉันสร้างตารางชั่วคราวขึ้นมาและปรากฏขึ้นด้วย
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.table_names()
นอกจากนี้เพื่อทดสอบว่ามีตารางอยู่หรือไม่:
engine.has_table(table_name)
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
มากกว่าและ"mysql://user:password@host"
engine.execute("use db_name")