Belgelerde bununla ilgili herhangi bir bilgi bulamadım, ancak SQLAlchemy'de oluşturulan tabloların bir listesini nasıl alabilirim?
Tabloları oluşturmak için sınıf yöntemini kullandım.
Belgelerde bununla ilgili herhangi bir bilgi bulamadım, ancak SQLAlchemy'de oluşturulan tabloların bir listesini nasıl alabilirim?
Tabloları oluşturmak için sınıf yöntemini kullandım.
Yanıtlar:
Tüm tablolar tables
, SQLAlchemy MetaData nesnesinin özniteliğinde toplanır . Bu tabloların isimlerinin bir listesini almak için:
>>> metadata.tables.keys()
['posts', 'comments', 'users']
Bildirime dayalı uzantıyı kullanıyorsanız, muhtemelen meta verileri kendiniz yönetmiyorsunuzdur. Neyse ki, meta veriler hala temel sınıfta mevcut.
>>> Base = sqlalchemy.ext.declarative.declarative_base()
>>> Base.metadata
MetaData(None)
Veritabanınızda hangi tabloların bulunduğunu anlamaya çalışıyorsanız, SQLAlchemy'ye henüz bahsetmediğiniz tablolar arasında bile, tablo yansımasını kullanabilirsiniz. SQLAlchemy daha sonra veritabanını inceleyecek ve meta verileri tüm eksik tablolarla güncelleyecektir.
>>> metadata.reflect(engine)
Postgres için, birden fazla şemanız varsa, motordaki tüm şemalar arasında döngü yapmanız gerekir:
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
argüman için MetaData.__init__
bir boolean bayrak, itiraz edildi, lehine kullanmanın MetaData.reflect()
benim cevap göstermiştir aynen.
MetaData.reflect()
, bu şekilde yöntemi kullanamayabileceklerini fark etmelerini sağlamak için ekledim . Ayrıca, motor bildiriminden kaynaklanan aynı soruna sahip olabilecek başka biri için de yorum yapın.
engine
Nesnede tabloların adını almak için bir yöntem vardır .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'
(yığın kesildi)
DB.engine.table_names()
veya veritabanı değişkeninin adı ne olursa olsun doğrudan erişim vardır .
from sqlalchemy import create_engine
engine = create_engine('postgresql://use:pass@localhost/DBname')
print (engine.table_names())
engine.table_names()
Python yorumlayıcı içinde db.engine.table_names () kullanın
$ python
>>> from myapp import db
>>> db.engine.table_names()
Bunun gibi bir şey arıyordum:
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()
Yürütür ve tüm tabloları döndürür.
Güncelleme:
Postgres:
eng = create_engine('postgresql+psycopg2://root:password@localhost/
q = eng.execute('SELECT * FROM pg_catalog.pg_tables')
Aynı sorunu çözüyorum ve bu yazıyı buldum. Biraz çalıştırmayı denedikten sonra, tüm tabloları listelemek için aşağıdakileri kullanmanızı öneririm: (zerocog tarafından bahsedilir)
metadata = MetaData()
metadata.reflect(bind=engine)
for table in metadata.sorted_tables:
print(table)
Bu, doğrudan masa kullanımı için kullanışlıdır ve tavsiye edildiğini düşünüyorum.
Ve tablo adlarını almak için aşağıdaki kodu kullanın:
for table_name in engine.table_names():
print(table_name)
"metadata.tables", tablo adı ve Tablo nesnesi için bir Dict sağlar. bu da hızlı sorgulama için yararlı olacaktır.
reflect
, metadata.sorted_tables
işe yaramaz
Tüm Tabloları Aynı Anda Yansıtmak, gizli tablo adlarını da almanıza olanak tanır. Bazı geçici tablolar oluşturdum ve
meta = MetaData()
meta.reflect(bind=myengine)
for table in reversed(meta.sorted_tables):
print table
Referans http://docs.sqlalchemy.org/en/latest/core/reflection.html
engine = sqlalchemy.create_engine('mysql://user:password@host/db_name')
yerine kullanın ."mysql://user:password@host"
engine.execute("use db_name")