Séma felfedezés mssql-python segítségével

Az mssql-python kurzorosztály kilenc metaadat-módszert biztosít, amelyek az ODBC katalógusfüggvényekhez fordulnak. Ezeket a módszereket használja táblázatok, oszlopok, tárolt eljárások, kulcsok és indexek felfedezésére programozóen. Segítenek adatvezérelt alkalmazásokat építeni, amelyek futásidőben alkalmazkodnak az adatbázis sémájához, például migrációs eszközöket, kódgenerátorokat vagy adminisztrátori irányítópultokat.

Módszer ODBC függvény Returns Mikor érdemes használni?
tables() SQLTables Táblázat- és nézetinformáció. Készletadatbázisok. Ellenőrizd a tábla létezését lekérdezések előtt.
columns() SQLColumns Oszlop részletei. DDL generálása, dinamikus lekérdezések összeállítása, vagy oszlopok kódhoz rendelése.
procedures() SQLProcedures Tárolt eljárási információk. Fedezze fel az elérhető API-kat. Generálj eljárás híváscsomagokat.
primaryKeys() SQLPrimaryKeys Az elsődleges kulcs oszlopai. Határozza meg az egyedi sorazonosítókat a(z) UPDATE/DELETE műveletekhez.
foreignKeys() SQLForeignKeys Külföldi kulcskapcsolatok. Térképezd le a táblakapcsolatokat, határozd meg törlési sorrendet a tisztító szkriptekhez.
statistics() SQLStatistics Index- és statisztikai információk. Ellenőrizd az index lefedettséget a teljesítményhangoláshoz.
rowIdColumns() SQLSpecialColumns (ROWID) Egyedi sorazonosító oszlopok. Találd meg a legjobb oszlopokat a konkrét sorok azonosítására.
rowVerColumns() SQLSpecialColumns (ROWVER) Sorverzió oszlopok. Implementálja az optimista párhuzamosságkezelést (az egyidejű módosítások észlelése).
getTypeInfo() SQLGetTypeInfo Adattípus-információk. Fedezze fel a támogatott típusokat a többplatformos kompatibilitáshoz.

Minden módszer egy kurzort ad vissza, amit iterálhatsz, hogy hozzáférj az eredményekhez.

Tables

Listázd fel a táblákat és nézeteket az adatbázisban:

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)

táblázat() paraméterek

A következő paraméterek szabályozzák a táblázat felfedezését:

Paraméter Leírás
table A táblanév mintája (támogatja a(z) % és _ helyettesítő karaktereket).
catalog Katalógus (adatbázis) név.
schema Séma névmintázat.
tableType Szűrő típus szerint: TABLE, VIEW, SYSTEM TABLE, GLOBAL TEMPORARYLOCAL TEMPORARYALIAS, . SYNONYM

táblázat() eredményoszlopok

A tables() módszer minden tábla vagy nézet esetében a következő oszlopokat adja vissza:

Column Leírás
table_cat Katalógus (adatbázis) név.
table_schem Séma neve.
table_name Táblázat vagy név megtekintése.
table_type TABLE, VIEW, SYSTEM TABLE, GLOBAL TEMPORARY, LOCAL TEMPORARYALIAS, , SYNONYM.
remarks Leírás vagy hozzászólások.

Nézd meg, van-e táblázat

Ellenőrizd, hogy létezik-e tábla, mielőtt lekérdeznéd:

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

Columns

Táblázatok oszlopinformációinak lekérése:

# 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() paraméterek

Szűrők az oszlopok felderítésének finomításához:

Paraméter Leírás
table Táblanév mintája.
catalog Katalógus (adatbázis) név.
schema Séma névmintázat.
column Oszlopnév mintázat.

columns() eredményoszlopok

A columns() módszer részletes információkat ad minden oszlopról:

Column Leírás
\, \, \ Helyszínazonosítók.
column_name Oszlop neve.
data_type SQL adattípus kód.
type_name Adattípus név (például , varcharint).
column_size Maximális hossz vagy pontosság.
buffer_length Pufferméret az átvitelekhez.
decimal_digits Skála a numerikus típusokhoz.
nullable 0 a nem null értékhez, 1 a null értéket megengedőhöz.
column_def Alapértelmezett érték.
ordinal_position Oszlop pozíciója (1-től indexelve).
is_nullable "YES" vagy "NO".

Tárolt eljárások

Fedezze fel a tárolt eljárásokat:

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

eljárás() paraméterek

Tárolt eljárások szűrése név vagy séma szerint:

Paraméter Leírás
procedure Eljárás névmintázat.
catalog Katalógus (adatbázis) név.
schema Séma névmintázat.

eljárások() eredményoszlopok

A procedures() módszer minden tárolt eljáráshoz metaadatokat ad vissza:

Column Leírás
procedure_cat, procedure_schem Helyszínazonosítók.
procedure_name Eljárás neve.
num_input_params A bemeneti paraméterek száma.
num_output_params Kimeneti paraméterek száma.
num_result_sets Eredményhalmazok száma.
remarks Description.
procedure_type Típusjelző.

Elsődleges kulcsok

Szerezz elsődleges kulcsoszlopokat egy táblázathoz:

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() paraméterek

Paraméterek az elsődleges kulcsinformációk visszaszerzéséhez:

Paraméter Leírás
table Tábla név (kötelező).
catalog Katalógus (adatbázis) név.
schema Séma neve.

primaryKeys() eredményoszlopok

A primaryKeys() módszer a következő információkat adja vissza:

Column Leírás
\, \, \ Helyszínazonosítók.
column_name Oszlop az elsődleges kulcsban.
key_seq Pozíció többoszlopos kulcsban (1-bázisú).
pk_name Elsődleges kulcskorlát neve.

Idegen kulcsok

Fedezze fel a külföldi kulcskapcsolatokat:

# 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() paraméterek

Határozz meg elsődleges kulcs- vagy idegen kulcstáblákat a kapcsolatok felfedezéséhez:

Paraméter Leírás
table Az elsődleges kulcs táblájának neve.
catalog Elsődleges kulcskatalógus.
schema Elsődleges kulcsséma.
foreignTable Az idegen kulcs táblaneve.
foreignCatalog Külföldi kulcskatalógus.
foreignSchema Külföldi kulcs séma.

foreignKeys() eredményoszlopok

A foreignKeys() módszer a következő oszlopokat adja vissza, amelyek a kapcsolatokat írják le:

Column Leírás
\, \, \ Hivatkozott (elsődleges) táblázat.
pkcolumn_name Hivatkozott oszlop.
\, \, \ Hivatkozási (külföldi) táblázat.
fkcolumn_name Hivatkozó oszlop.
key_seq Pozíció többoszlopos kulcsban.
update_rule Művelet itt: UPDATE.
delete_rule Művelet a következőn: DELETE.
fk_name Idegen kulcs megkötött név.
pk_name Elsődleges kulcskorlát neve.

Indexek és statisztikák

Szerezz index információkat egy táblázathoz:

# 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}")

statisztika() paraméterek

Az indexfelderítést az alábbi szűrőkkel konfiguráljuk:

Paraméter Default Leírás
table (required) Tábla neve.
catalog None Katalógus (adatbázis) név.
schema None Séma neve.
unique False Csak egyedi indexeket adnak vissza.
quick True Hagyd ki a költséges kardinalitás-/oldallekérést.

statisztikák() eredményoszlopok

A statistics() módszer indexet és statisztikai információkat hoz, amelyek a következőket eredményezik:

Column Leírás
\, \, \ Helyszínazonosítók.
non_unique 0 egyedi esetén, 1 nem egyedi esetén.
index_name Index neve.
type Index típusa.
ordinal_position Az oszlop pozíciója az indexben.
column_name Oszlop neve.
asc_or_desc A A felemelkedésre, D a leszállásra.
cardinality Sorok számának becslése.
pages Oldalszám.

Sorazonosító oszlopok

Találj olyan oszlopokat, amelyek egyediségesen azonosítanak egy sort:

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

Ez a módszer a legjobb oszlophalmazt adja vissza, hogy egyedileg azonosítsanak egy sort, ami lehet a fő kulcs vagy egy egyedi index.

Sorverziós oszlopok

Keress olyan oszlopokat, amelyek automatikusan frissülnek, ha bármely sorérték megváltozik. Használj sorverziós oszlopokat optimista egyidejű vezérléshez, ahol elolvasod a sor verzióját, módosíthatsz, majd ellenőrizd, hogy a jelenlegi sorverzió ugyanaz-e, mielőtt írnád:

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

Az eredmény jellemzően az optimista konkurenciakezeléshez használt rowversion/timestamp oszlopokat tartalmazza.

Adattípus adatai

Információt kapjon a támogatott SQL adattípusokról:

# 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() paraméterek

Opcionális paraméterek a támogatott SQL típusok szűréséhez:

Paraméter Leírás
sqlType SQL típusállandó (minden típus esetén kihagyva).

Biztonsági megfontolások

Caution

Ezek a módszerek adatbázis-séma metaadatokat tárnak fel. Bár maguk a metódusok biztonságosan végrehajthatók, a visszaküldött információk felfedik az adatbázis szerkezetét (táblanevek, oszlopnevek, kapcsolatok, adattípusok).

  • Ne tegyen fel nyers metaadatokat megbízhatatlan felhasználóknak.
  • Eredmények tisztítása vagy szűrése több-bérlős alkalmazásokban.
  • Korlátozzuk a hozzáférést külső alkalmazásokban.

Példa: Sémajelentés generálása

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