mssql-python ile şema keşfi

mssql-python imleç sınıfı, ODBC katalog fonksiyonlarına eşlenen dokuz meta veri yöntemi sunar. Bu yöntemleri kullanarak tabloları, sütunları, depolanmış prosedürleri, anahtarları ve indeksleri programatik olarak keşfedebilirsiniz. Veritabanı şemasına çalışma zamanında uyum sağlayan veri odaklı uygulamalar oluşturmanıza yardımcı olurlar; örneğin göç araçları, kod oluşturucular veya yönetici panelleri gibi.

Method ODBC fonksiyonu İadeler Ne zaman kullanılır?
tables() SQLTables Tablo ve görüntü bilgileri. Envanter veritabanları. Sorgulardan önce tablo varlığını doğrulayın.
columns() SQLColumns Sütun detayları. DDL oluşturun, dinamik sorgular oluşturun veya sütunları koda eşleyin.
procedures() SQLProcedures Saklanan prosedür bilgileri. Mevcut API'leri keşfedin. Prosedür çağrı wrapper'ları oluşturun.
primaryKeys() SQLPrimaryKeys Birincil anahtar sütunlar. / işlemler için benzersiz satır tanımlayıcılarını UPDATEDELETE belirleyin.
foreignKeys() SQLForeignKeys Yabancı anahtar ilişkileri. Tablo ilişkilerini haritalayın, temizleme betikleri için silme sırasını belirleyin.
statistics() SQLStatistics İndeks ve istatistikler bilgileri. Performans ayarı için indeks kapsamını doğrulayın.
rowIdColumns() SQLSpecialColumns (ROWID) Benzersiz satır tanımlayıcı sütunları. Belirli satırları tanımlamak için en iyi sütunları bulun.
rowVerColumns() SQLSpecialColumns (ROWVER) Satır versiyonu sütunları. İyimser eşzamanlılık uygulayın (eşzamanlı değişiklikleri tespit edin).
getTypeInfo() SQLGetTypeInfo Veri türü bilgileri. Platformlar arası uyumluluk için desteklenen türleri keşfedin.

Her yöntem sonuçlara erişmek için yineleme yapabileceğiniz bir imleci geri döndürüyor.

Tables

Veritabanında tabloları ve görünümleri listeleyin:

cursor = conn.cursor()

# List all tables
for row in cursor.tables():
    print(f"{row.table_schem}.{row.table_name} ({row.table_type})")

# Filter by name (supports wildcards % and _)
for row in cursor.tables(table="Product%"):
    print(row.table_name)

# Filter by schema
for row in cursor.tables(schema="Sales"):
    print(row.table_name)

# Filter by type
for row in cursor.tables(tableType="TABLE"):  # Excludes views
    print(row.table_name)

tables() parametreleri

Aşağıdaki parametreler tablo keşfini kontrol eder:

Parametre Açıklama
table Tablo adı deseni (% ve _ joker karakterlerini destekleyen).
catalog Katalog (veritabanı) adı.
schema Şema isim deseni.
tableType Tipe göre filtreleyin: TABLE, VIEW, SYSTEM TABLE, GLOBAL TEMPORARYLOCAL TEMPORARYALIAS, , . SYNONYM

tables() sonuç sütunları

Yöntem, tables() her tablo veya görünüm için aşağıdaki sütunları döndürür:

Column Açıklama
table_cat Katalog (veritabanı) adı.
table_schem Şema adı.
table_name Tablo veya görünüm adı.
table_type TABLE, VIEW, SYSTEM TABLE, GLOBAL TEMPORARY, LOCAL TEMPORARY, ALIAS, . SYNONYM
remarks Açıklama veya yorumlar.

Bir tablo var mı kontrol edin

Bir tabloyu sorgulamadan önce var olup olmadığını doğrulayın:

if cursor.tables(table="Product", schema="Production").fetchone():
    print("Product table exists")
else:
    print("Product table not found")

Kolonlar

Tablolar için sütun bilgisini alın:

# All columns in a table
for row in cursor.columns(table="Product", schema="Production"):
    print(f"{row.column_name}: {row.type_name}({row.column_size})")
    print(f"  Nullable: {row.nullable}, Position: {row.ordinal_position}")

# Filter by column name
for row in cursor.columns(table="Product", schema="Production", column="List%"):
    print(row.column_name)

columns() parametreleri

Sütun keşfini geliştirmek için filtreler:

Parametre Açıklama
table Tablo adı biçimi.
catalog Katalog (veritabanı) adı.
schema Şema isim deseni.
column Sütun adı biçimi.

columns() sonuç sütunları

Yöntem, columns() her sütun hakkında ayrıntılı bilgi sağlar:

Column Açıklama
table_cat, table_schem, table_name Konum tanımlayıcıları.
column_name Sütun adı.
data_type SQL veri tipi kodu.
type_name Veri tipi adı (örneğin, varchar, int).
column_size Maksimum uzunluk veya hassasiyet.
buffer_length Transferler için tampon boyutu.
decimal_digits Sayısal tipler için ölçek.
nullable 0 NOT NULL için, 1 nullable için.
column_def Varsayılan değer.
ordinal_position Kolon konumu (1 bazlı).
is_nullable "YES" veya "NO".

Saklanan prosedürler

Saklanan prosedürleri keşfedin:

# List all procedures
for row in cursor.procedures():
    print(f"{row.procedure_schem}.{row.procedure_name}")

# Filter by name pattern
for row in cursor.procedures(procedure="Get%"):
    print(row.procedure_name)

prosedür() parametreleri

Depolanan prosedürleri isim veya şemaya göre filtreleyin:

Parametre Açıklama
procedure İşlem adı modeli.
catalog Katalog (veritabanı) adı.
schema Şema isim deseni.

prosedürler() sonuç sütunları

Yöntem, procedures() her depolanmış prosedür için meta veri döner:

Column Açıklama
procedure_cat, procedure_schem Konum tanımlayıcıları.
procedure_name Yordam adı.
num_input_params Giriş parametreleri sayısı.
num_output_params Çıkış parametreleri sayısı.
num_result_sets Sonuç kümelerinin sayısı.
remarks Açıklama.
procedure_type Tip göstergesi.

Birincil anahtarlar

Bir tablo için birincil anahtar sütunlarını alın:

for row in cursor.primaryKeys(table="Product", schema="Production"):
    print(f"PK column: {row.column_name} (position {row.key_seq})")
    print(f"Constraint name: {row.pk_name}")

primaryKeys() parametreleri

Birincil anahtar bilgisini almak için parametreler:

Parametre Açıklama
table Tablo adı (zorunlu).
catalog Katalog (veritabanı) adı.
schema Şema adı.

primaryKeys() sonuç sütunları

Yöntem primaryKeys() aşağıdaki bilgileri geri döner:

Column Açıklama
table_cat, table_schem, table_name Konum tanımlayıcıları.
column_name Birincil anahtardaki sütun.
key_seq Çok sütunlu anahtardaki konum (1’den başlayan).
pk_name Birincil anahtar kısıtlama adı.

Yabancı anahtarlar

Yabancı anahtar ilişkilerini keşfedin:

# Foreign keys from a table (outbound references)
for row in cursor.foreignKeys(table="SalesOrderDetail", schema="Sales"):
    print(f"FK {row.fk_name}:")
    print(f"  {row.fktable_name}.{row.fkcolumn_name}")
    print(f"  -> {row.pktable_name}.{row.pkcolumn_name}")

# Foreign keys to a table (inbound references)
for row in cursor.foreignKeys(foreignTable="Product", foreignSchema="Production"):
    print(f"{row.fktable_name} references Product")

foreignKeys() parametreleri

İlişkileri keşfetmek için birincil anahtar veya yabancı anahtar tabloları belirtin:

Parametre Açıklama
table Birincil anahtar tablo adı.
catalog Birincil anahtar kataloğu.
schema Birincil anahtar şeması.
foreignTable Yabancı anahtar tablosunun adı.
foreignCatalog Yabancı anahtar kataloğu.
foreignSchema Yabancı anahtar şeması.

foreignKeys() sonuç sütunları

Yöntem, foreignKeys() ilişkileri tanımlayan aşağıdaki sütunları döndürür:

Column Açıklama
pktable_cat, pktable_schem, pktable_name Referanslı (birincil) tablo.
pkcolumn_name Başvurulan sütun.
fktable_cat, fktable_schem, fktable_name Referans (yabancı) tablo.
fkcolumn_name Başvuru sütunu.
key_seq Çok sütunlu anahtar içindeki konum.
update_rule Eylem UPDATE.
delete_rule Eylem DELETE.
fk_name Yabancı anahtar kısıtının adı.
pk_name Birincil anahtar kısıtlama adı.

Endeksler ve istatistikler

Bir tablo için indeks bilgisini alın:

# All indexes on a table
for row in cursor.statistics(table="Product", schema="Production"):
    if row.index_name:  # Skip table statistics row
        print(f"Index: {row.index_name}")
        print(f"  Column: {row.column_name} (position {row.ordinal_position})")
        print(f"  Unique: {not row.non_unique}")

# Only unique indexes
for row in cursor.statistics(table="Product", schema="Production", unique=True):
    print(f"Unique index: {row.index_name}")

istatistik() parametreleri

Indeks keşfini şu filtrelerle yapılandırın:

Parametre Varsayılan Açıklama
table (required) Tablo adı.
catalog Hiçbiri Katalog (veritabanı) adı.
schema Hiçbiri Şema adı.
unique Yanlış Sadece benzersiz indeksler döndürün.
quick True Pahalı kardinalite/sayfa geri alımını atlayın.

istatistik() sonuç sütunları

statistics() yöntemi, dizin ve istatistik bilgilerini döndürür:

Column Açıklama
table_cat, table_schem, table_name Konum tanımlayıcıları.
non_unique 0 benzersiz için, 1 benzersiz olmayan için.
index_name Dizin adı.
type Dizin türü.
ordinal_position Indekste sütun konumu.
column_name Sütun adı.
asc_or_desc A yükselmek için, D inmek için.
cardinality Satır sayısı tahmini.
pages Sayfa sayısı.

Satır tanımlayıcı sütunları

Bir satırı benzersiz şekilde tanımlayan sütunları bulun:

for row in cursor.rowIdColumns(table="Product", schema="Production"):
    print(f"Row ID column: {row.column_name} ({row.type_name})")

Bu yöntem, bir satırı benzersiz şekilde tanımlamak için en iyi sütun setini döndürür; bu satır, birincil anahtar veya benzersiz bir indeks olabilir.

Satır versiyon sütunları

Herhangi bir satır değeri değiştiğinde otomatik güncellenen sütunları bulun. İyimser eşzamanlılık denetimi için satır sürümü sütunlarını kullanın; burada bir satırın sürümünü okur, değişiklikler yapar ve ardından yazmadan önce geçerli satır sürümünün aynı olduğunu doğrularsınız:

for row in cursor.rowVerColumns(table="Product", schema="Production"):
    print(f"Version column: {row.column_name}")

Sonuç genellikle iyimser eşzamanlılık için kullanılan sütunları içerir rowversion/timestamp .

Veri türü bilgileri

Desteklenen SQL veri türleri hakkında bilgi edinin:

# All supported types
for row in cursor.getTypeInfo():
    print(f"{row.type_name}: {row.data_type}")
    print(f"  Max size: {row.column_size}")
    print(f"  Nullable: {row.nullable}")

# Specific type
for row in cursor.getTypeInfo(sqlType=mssql_python.SQL_VARCHAR):
    print(f"VARCHAR max size: {row.column_size}")

getTypeInfo() parametreleri

Desteklenen SQL tiplerini filtrelemek için isteğe bağlı parametreler:

Parametre Açıklama
sqlType SQL tür sabiti (tüm türler için atlanır).

Güvenlik konuları

Caution

Bu yöntemler veritabanı şeması meta verilerini ortaya çıkarır. Yöntemlerin kendisi yürütülmesi güvenli olsa da, geri dönen bilgiler veritabanınızın yapısını (tablo adları, sütun adları, ilişkiler, veri türleri) ortaya koyar.

  • Ham meta verileri güvenilmeyenler için açığa çıkarmayın.
  • Çok kiracılı uygulamalarda sonuçları temizleyin veya filtreleyin.
  • Dışa dönük uygulamalarda erişimi kısıtlayın.

Örnek: Şema raporu oluşturma

def describe_table(conn, table_name):
    """Generate a schema description for a table."""
    cursor = conn.cursor()
    
    print(f"\n=== {table_name} ===\n")
    
    # Columns
    print("Columns:")
    for col in cursor.columns(table=table_name):
        nullable = "NULL" if col.nullable else "NOT NULL"
        print(f"  {col.column_name}: {col.type_name}({col.column_size}) {nullable}")
    
    # Primary key
    print("\nPrimary Key:")
    pk_cols = cursor.primaryKeys(table=table_name).fetchall()
    if pk_cols:
        pk_names = ", ".join(row.column_name for row in pk_cols)
        print(f"  {pk_cols[0].pk_name}: ({pk_names})")
    else:
        print("  (none)")
    
    # Foreign keys
    print("\nForeign Keys:")
    for fk in cursor.foreignKeys(table=table_name):
        print(f"  {fk.fk_name}: {fk.fkcolumn_name} -> {fk.pktable_name}.{fk.pkcolumn_name}")
    
    # Indexes
    print("\nIndexes:")
    for idx in cursor.statistics(table=table_name):
        if idx.index_name:
            unique = "UNIQUE " if not idx.non_unique else ""
            print(f"  {unique}{idx.index_name}: {idx.column_name}")

# Usage
describe_table(conn, "Product")