SQLAlchemy-테이블 목록 가져 오기


94

문서에서 이에 대한 정보를 찾을 수 없지만 SQLAlchemy에서 생성 된 테이블 목록을 어떻게 얻을 수 있습니까?

클래스 메서드를 사용하여 테이블을 만들었습니다.

답변:


86

모든 테이블은 tablesSQLAlchemy 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)

7
버전 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 2014 년

2
@IfLoop : 저의 가난한 영어에 대해 매우 죄송합니다. 당신의 대답은 정확히 맞고 나는 그것을 올렸습니다. 나는 사람들이 버전 <0.8을 사용 MetaData.reflect()하면 이런 식으로 메소드를 사용하지 않을 수 있음을 사람들에게 알리기 위해 그 주석을 추가했습니다 . 또한 엔진 선언으로 인해 동일한 문제가 발생할 수있는 다른 사람을 위해이를 언급하십시오.
Java Xu

78

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

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

3
이것은 2018 년 11 월 현재 작동하는 정답입니다.
Austin Mackillop

작동하지 않는 경우 엔진이 올바르게 연결되지 않았기 때문일 가능성이 높지만 (2 행에 문제가 있음) 실행할 때까지 오류 메시지가 표시되지 않습니다engine.table_names()
grofte

이 대답을 사용하십시오.
Manakin

12

파이썬 인터프리터 내에서 db.engine.table_names () 사용

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

11

나는 다음과 같은 것을 찾고 있었다.

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

영업 이익은하지 SQL 포스트 그레스 요청
오 elhajoui

4

테이블을 생성 한 메타 데이터 개체는 사전에 있습니다.

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를 제공합니다. 빠른 쿼리에도 유용합니다.


이! 를 빼고 reflect, metadata.sorted_tables작동하지 않습니다
케이


2

간단합니다.

engine.table_names()

또한 테이블이 있는지 테스트하려면 다음을 수행하십시오.

engine.has_table(table_name)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.