Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kursorklassen mssql-python tillhandahåller nio metadatametoder som mappas till ODBC-katalogfunktioner. Använd dessa metoder för att programmatiskt upptäcka tabeller, kolumner, lagrade procedurer, nycklar och index. De hjälper dig att bygga datadrivna applikationer som anpassar sig till databasschemat vid körning, såsom migreringsverktyg, kodgeneratorer eller admininstrumentpaneler.
| Metod | ODBC-funktion | Returns | När det bör användas |
|---|---|---|---|
tables() |
SQLTables | Information om tabeller och vyer. | Inventariedatabaser. Validera tabellens existens innan frågor. |
columns() |
SQLColumns | Kolumndetaljer. | Generera DDL, bygg dynamiska frågor eller mappa kolumner till kod. |
procedures() |
SQLProcedures | Information om lagrade procedurer. | Upptäck tillgängliga API:er. Generera omslutande funktioner för proceduranrop. |
primaryKeys() |
SQLPrimaryKeys | Primärnyckelkolumner. | Identifiera unika radidentifierare för UPDATE/DELETE operationer. |
foreignKeys() |
SQLForeignKeys | Utländska nyckelrelationer. | Kartlägg tabellrelationer, bestäm raderingsordning för saneringsskript. |
statistics() |
SQLStatistics | Index och statistikinformation. | Kontrollera indextäckning för prestandaoptimering. |
rowIdColumns() |
SQLSpecialColumns (ROWID) | Kolumner med unika rad-ID:n. | Hitta de bästa kolumnerna att använda för att identifiera specifika rader. |
rowVerColumns() |
SQLSpecialColumns (ROWVER) | Kolumner för radversionering. | Implementera optimistisk samtidighet (upptäck samtidiga ändringar). |
getTypeInfo() |
SQLGetTypeInfo | Information om datatyp. | Upptäck stödda typer för plattformsoberoende kompatibilitet. |
Varje metod returnerar en markör som du kan iterera för att komma åt resultaten.
Tables
Lista tabeller och vyer i databasen:
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)
tabell()-parametrar
Följande parametrar styr identifiering av tabeller:
| Parameter | Beskrivning |
|---|---|
table |
Tabellnamnsmönster (stöder jokertecknen % och _). |
catalog |
Katalog- (databas)namn. |
schema |
Schemanamnsmönster. |
tableType |
Filtrera efter typ: TABLE, VIEW, SYSTEM TABLE, GLOBAL TEMPORARY, LOCAL TEMPORARY, ALIAS, , . SYNONYM |
tabell() resultatkolumner
Metoden tables() returnerar följande kolumner för varje tabell eller vy:
| Column | Beskrivning |
|---|---|
table_cat |
Katalog- (databas)namn. |
table_schem |
Namn på schema. |
table_name |
Tabell- eller vynamn. |
table_type |
TABLE, VIEW, SYSTEM TABLE, GLOBAL TEMPORARY, LOCAL TEMPORARY, , ALIAS, . SYNONYM |
remarks |
Beskrivning eller kommentarer. |
Kontrollera om det finns en tabell
Verifiera att en tabell finns innan du frågar den:
if cursor.tables(table="Product", schema="Production").fetchone():
print("Product table exists")
else:
print("Product table not found")
Columns
Hämta kolumninformation för tabeller:
# 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)
kolumn()-parametrar
Filter för att förfina kolumnupptäckten:
| Parameter | Beskrivning |
|---|---|
table |
Tabellnamnsmönster. |
catalog |
Katalog- (databas)namn. |
schema |
Mönster för schemanamn. |
column |
Kolumnnamnsmönster. |
kolumner() resultatkolumner
Metoden returnerar columns() detaljerad information om varje kolumn:
| Column | Beskrivning |
|---|---|
table_cat, table_schem, table_name |
Platsidentifierare. |
column_name |
Kolumnnamn. |
data_type |
SQL-datatypkod. |
type_name |
Datatypnamn (till exempel varchar, ). int |
column_size |
Maximal längd eller precision. |
buffer_length |
Buffertstorlek för överföringar. |
decimal_digits |
Skala för numeriska typer. |
nullable |
0 för INTE NULL, 1 för nullbar. |
column_def |
Standardvärde. |
ordinal_position |
Kolumnposition (1-baserad). |
is_nullable |
"YES" eller "NO". |
Lagrade procedurer
Upptäck lagrade metoder:
# 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)
parametrar för procedurer()
Filtrera lagrade procedurer efter namn eller schema:
| Parameter | Beskrivning |
|---|---|
procedure |
Procedurnamnsmönster. |
catalog |
Katalog- (databas)namn. |
schema |
Schemanamnsmönster. |
procedurer() resultatkolumner
Metoden procedures() returnerar metadata för varje lagrad procedur:
| Column | Beskrivning |
|---|---|
procedure_cat, procedure_schem |
Platsidentifierare. |
procedure_name |
Procedurnamn. |
num_input_params |
Antal ingångsparametrar. |
num_output_params |
Antal utgångsparametrar. |
num_result_sets |
Antal resultatuppsättningar. |
remarks |
Description. |
procedure_type |
Typindikator. |
Primärnycklar
Hämta primärnyckelkolumner för en tabell:
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}")
parametrar för primaryKeys()
Parametrar för att hämta primärnyckelinformation:
| Parameter | Beskrivning |
|---|---|
table |
Tabellnamn (krävs). |
catalog |
Katalog- (databas)namn. |
schema |
Namn på schema. |
primaryKeys() resultatkolumner
Metoden primaryKeys() returnerar följande information:
| Column | Beskrivning |
|---|---|
table_cat, table_schem, table_name |
Platsidentifierare. |
column_name |
Kolumn i den primära nyckeln. |
key_seq |
Position i flerkolumnsnyckeln (ettbaserad). |
pk_name |
Primärnyckelbegränsningens namn. |
Främmande nycklar
Upptäck utländska nyckelrelationer:
# 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")
Parametrar för foreignKeys()
Specificera primärnyckel- eller främmande nyckeltabeller för att upptäcka relationer:
| Parameter | Beskrivning |
|---|---|
table |
Namn på primärnyckeltabell. |
catalog |
Katalog för primärnycklar. |
schema |
Primärnyckelschema. |
foreignTable |
Tabellnamn för främmande nyckel. |
foreignCatalog |
Främmande nyckelkatalog. |
foreignSchema |
Främmande nyckelschema. |
foreignKeys() resultatkolumner
Metoden foreignKeys() returnerar följande kolumner som beskriver relationer:
| Column | Beskrivning |
|---|---|
pktable_cat, pktable_schem, pktable_name |
Referens (primär) tabell. |
pkcolumn_name |
Referenskolumn. |
fktable_cat, fktable_schem, fktable_name |
Referenstabell (utländsk). |
fkcolumn_name |
Referenskolumn. |
key_seq |
Position i nyckel med flera kolumner. |
update_rule |
Åtgärd på UPDATE. |
delete_rule |
Åtgärd för DELETE. |
fk_name |
Främmande nyckelbegränsningsnamn. |
pk_name |
Primärnyckelbegränsningens namn. |
Index och statistik
Få indexinformation till en tabell:
# 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}")
Statistik()-parametrar
Konfigurera indexupptäckt med dessa filter:
| Parameter | Standardinställning | Beskrivning |
|---|---|---|
table |
(required) | Tabellnamn. |
catalog |
None | Katalog- (databas)namn. |
schema |
None | Namn på schema. |
unique |
Falskt | Returnera endast unika index. |
quick |
Sann | Hoppa över kostsam hämtning av kardinalitet/sidor. |
statistik() resultatkolumner
Metoden statistics() returnerar index- och statistikinformation:
| Column | Beskrivning |
|---|---|
table_cat, table_schem, table_name |
Platsidentifierare. |
non_unique |
0 för unik, 1 för icke-unik. |
index_name |
Indexets namn. |
type |
Typ av index. |
ordinal_position |
Kolumnposition i index. |
column_name |
Kolumnnamn. |
asc_or_desc |
A för uppstigande, D för nedåtgående. |
cardinality |
Uppskattat antal rader. |
pages |
Antal sidor |
Radidentifierarkolumner
Hitta kolumner som unikt identifierar en rad:
for row in cursor.rowIdColumns(table="Product", schema="Production"):
print(f"Row ID column: {row.column_name} ({row.type_name})")
Denna metod returnerar den bästa uppsättningen kolumner för att unikt identifiera en rad, vilket kan vara primärnyckeln eller ett unikt index.
Kolumner för radversion
Hitta kolumner som automatiskt uppdateras när något radvärde ändras. Använd radversionskolumner för optimistisk samtidighetskontroll, där du läser en rads version, gör ändringar och sedan verifierar att den aktuella radversionen är densamma innan du skriver:
for row in cursor.rowVerColumns(table="Product", schema="Production"):
print(f"Version column: {row.column_name}")
Resultatet inkluderar rowversion/timestamp vanligtvis kolumner som används för optimistisk samtidighet.
Information om datatyp
Få information om stödda SQL-datatyper:
# 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()-parametrar
Valfria parametrar för att filtrera stödda SQL-typer:
| Parameter | Beskrivning |
|---|---|
sqlType |
SQL-typkonstant (utelämna för alla typer). |
Säkerhetsfrågor
Caution
Dessa metoder exponerar metadata från databasens schema. Även om metoderna i sig är säkra att köra, avslöjar den returnerade informationen din databasstruktur (tabellnamn, kolumnnamn, relationer, datatyper).
- Exponera inte rå metadata för opålitliga användare.
- Sanera eller filtrera resultat i flerklientprogram.
- Begränsa åtkomsten i externa applikationer.
Exempel: Generera en schemarapport
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")