2011-06-24 121 views

回答

52

所有這些表都收集在sqlalchemy元數據對象的tables屬性中。以獲得這些表名稱的列表:

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

如果您使用聲明性擴展,那麼您可能不是自己管理元數據。幸運的是,元數據仍然存在於基類,

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

如果你正在試圖找出哪些表存在於數據庫中,即使在你還沒有還跟SQLAlchemy的瞭解尚的人,那麼你就可以使用表反射。然後,sqlalchemy將檢查數據庫並使用所有缺少的表更新元數據。

>>> metadata.reflect(engine) 
+3

從版本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 「)'。 –

+0

@XuJiawan:我不確定哪個東西在這裏被棄用,我不確定哪個方法在暗示它是不是'sqlalchemy.MetaData.reflect()'? – SingleNegationElimination

+0

@IfLoop:我從[sqlalchemy文檔]找到它(http://docs.sqlalchemy.org/en/rel_0_9/core/metadata.html#sqlalchemy.schema.MetaData.params.reflect)。 –

4

您創建表的元數據對象在字典中具有該元數據對象。

metadata.tables.keys() 
30

有一種方法在engine對象中獲取表名列表。 engine.table_names()

+0

我得到 '回溯(最近最後一次通話): 文件 「dedup_jobs.py」 31行,在 打印(engine.table_names()) 文件「/Users/darshanchoudhary/.virtualenvs/services/lib/ python3.6/site-packages/sqlalchemy/engine/base.py「,第2128行,在table_names中 return self.dialect.get_table_names(conn,schema) value = value.replace(self.escape_quote,self.escape_to_quote) AttributeError:'NoneType'對象沒有'replace''屬性 (堆棧被截斷) –

6

我一直在尋找這樣的事情:

from sqlalchemy import create_engine 
    eng = create_engine('mysql+pymysql://root:[email protected]:3306', pool_recycle=3600) 
    q = eng.execute('SHOW TABLES') 

    available_tables = q.fetchall() 

它的執行,並返回所有的表。

更新:

Postgres的:

eng = create_engine('postgresql+psycopg2://root:[email protected]/ 
q = eng.execute('SELECT * FROM pg_catalog.pg_tables') 
+3

這不是跨平臺的。它只適用於mysql,它不會與其他數據庫引擎一起工作。 –

+0

@EdwardBetts你是對的,你想知道什麼數據庫引擎? – jmunsch

2
from sqlalchemy import create_engine 
engine = create_engine('postgresql://use:[email protected]/DBname') 
print (engine.table_names()) 
0

出現了我解決同樣的問題,發現這個職位。一些試運行結束後,我會建議使用下面列出的所有表:(由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」提供了字典的表名和表對象。這對快速查詢也很有用。