programing

SQL Chemy - 테이블 목록 가져오기

yoursource 2022. 11. 1. 22:22
반응형

SQL Chemy - 테이블 목록 가져오기

문서에서는 이에 대한 정보를 찾을 수 없었습니다만, SQL Chemy에서 작성된 테이블 목록은 어떻게 얻을 수 있습니까?

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

모든 테이블은 에 수집됩니다.tablesSQLAlchemy MetaData 객체의 속성.이러한 테이블의 이름 목록을 가져오려면 다음 절차를 수행합니다.

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

선언 확장자를 사용하는 경우 메타데이터를 직접 관리하지 않을 수 있습니다.다행히 메타데이터는 아직 base class에 존재합니다.

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

SQL Chemy에 아직 알리지 않은 테이블이라도 데이터베이스에 어떤 테이블이 있는지 알아내려면 테이블 리플렉션을 사용할 수 있습니다.SQL Chemy는 데이터베이스를 검사하고 누락된 모든 테이블로 메타데이터를 업데이트합니다.

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

에는 방법이 있다.engineobject를 지정하면 테이블 이름 목록을 가져올 수 있습니다. engine.table_names()

from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
  • DB에 있는 모든 기존 테이블 목록을 가져오려면:

SQL Chemy 1.4 현재 : https://docs.sqlalchemy.org/en/14/core/reflection.html#fine-grained-reflection-with-inspector

from sqlalchemy import create_engine
from sqlalchemy import inspect
engine = create_engine('...')
insp = inspect(engine)
print(insp.get_table_names())

오래된 방식(engine.table_names())의 수율:

SADeprecationWarning: The from_engine() method on Inspector is deprecated and will be removed in a future release. Please use the sqlalchemy.inspect() function on an Engine or Connection in order to acquire an Inspector. (deprecated since: 1.4)

  • 선언된 테이블 목록을 가져오려면 수락된 답변을 사용합니다.metadata.tables.keys()

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

실행되어 모든 테이블을 반환합니다.

업데이트:

포스트그레스:

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

심플한 것은 다음과 같습니다.

engine.table_names()

또한 테이블이 존재하는지 테스트하려면 다음 절차를 수행합니다.

engine.has_table(table_name)

테이블을 작성한 메타데이터 오브젝트에는 사전에 이 정보가 포함되어 있습니다.

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"는 테이블 이름과 테이블 객체에 대한 딕트를 제공합니다.빠른 질의에도 유용할 것입니다.

2021-10-22 현재 사용하고 있는 것은 다음과 같습니다.

import sqlalchemy as sql

engine = sql.create_engine("connection_string")

sql.inspect(engine).get_table_names()

모든 테이블을 한 번에 리플렉트하면 숨겨진 테이블 이름도 검색할 수 있습니다.임시 테이블을 몇 개 만들었는데

meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
    print table

레퍼런스 http://docs.sqlalchemy.org/en/latest/core/reflection.html

은 '우리'를 사용하는 입니다.inspect:

  1. 인스펙터를 생성하여 엔진에 연결합니다.
  2. 데이터베이스 내의 테이블 이름 수집
  3. 테이블 열 이름 수집
from sqlalchemy import create_engine, inspect

engine = create_engine("sqlite:///../Resources/dow.sqlite")
conn = engine.connect()
inspector = inspect(conn)
inspector.get_table_names() #returns "dow"

columns = inspector.get_columns('dow')

for column in columns:
    print(column["name"], column["type"])

Flask-SQ를 사용하는 경우LAlchemy, DB 인스턴스에서 가져올 수 있습니다.

[...]
db = SQLAlchemy(app)
db.engine.table_names() # you'll get a list of all the table names in your database

모든 열 정보를 표시하는 전체 예제입니다.인 것으로 가정합니다.df에는 SQL 데이터베이스에 쓰는 데이터 프레임이 포함되어 있습니다.

from sqlalchemy import create_engine, inspect
from sqlalchemy_utils.functions import database_exists, create_database

engine = create_engine('sqlite:///mydb.sqlite', echo=True)

if not database_exists(engine.url):
    create_database(engine.url)
else:
    engine.connect()

df.to_sql('MyTable', con=engine, if_exists='replace', index=False) # index=False avoids auto-creation of level_0 (name tiebreaker)

inspector = inspect(engine)
table_names = inspector.get_table_names()
for table_name in table_names:
    print(f"Table:{table_name}")
    column_items = inspector.get_columns(table_name)
    print('\t'.join(n for n in column_items[0]))
    for c in column_items:
        assert len(c) == len(column_items[0])
        print('\t'.join(str(c[n]) for n in c))

저는 개인적으로 이렇게 하면 효과가 있습니다.

from sqlalchemy import inspect
inspector = inspect(engine)
inspector.get_table_names()

내 DB에 있는 모든 이름을 알려줘요

언급URL : https://stackoverflow.com/questions/6473925/sqlalchemy-getting-a-list-of-tables

반응형