select()

Sendet ein SQL-Statement über ado.ExecuteSQL an den Server und gibt das geparste ADO Recordset XML als ECMDbResult zurück. Positionsparameter werden sicher in die Abfrage eingebunden — niemals String-Formatierung für Benutzereingaben verwenden.

Ohne zusätzliche Serverkonfiguration werden nur SELECT-Abfragen unterstützt. Datenmanipulationsoperationen (INSERT, UPDATE, DELETE) müssen über eine Registry-Einstellung am Applikationsserver explizit aktiviert werden.

1. Signatur

  • Sync

  • Async

ecm.db.select(sql: str, *params: int | str | float, flags: int = 0) -> ECMDbResult
await ecm.db.select(sql: str, *params: int | str | float, flags: int = 0) -> ECMDbResult

2. Parameter

Parameter Typ Standard Beschreibung

sql

str

SQL-Template-String mit optionalen Platzhaltern.

*params

int | str | float

Werte, die der Reihe nach in die Platzhalter eingesetzt werden. Die Anzahl muss mit der Anzahl der Nicht-%%-Platzhalter übereinstimmen.

flags

int

0

Bitmaske für Flags von ado.ExecuteSQL. 0 = automatisches N-Präfix für String-Literale auf Unicode-Servern (Standard). 2 = kein automatisches Präfixing.

3. Platzhalter

Platzhalter Typ Verhalten

%s

String

Anführungszeichen werden escaped ('''); Wert wird in '…​' eingeschlossen.

%w

Word-String

Wie %s, aber zusätzlich werden Leerzeichen und SQL-Kommentarzeichen (--, /, /) abgelehnt.

%d

Integer

Wert wird auf int gecastet; nicht-numerische Werte werfen ValueError.

%f

Float

Wert wird auf float gecastet; nicht-numerische Werte werfen ValueError.

%u

Unquoted Identifier

Nur Buchstaben, Ziffern, _, @, $, # sind erlaubt. Wert wird ohne Anführungszeichen eingefügt. Für Tabellen- oder Spaltennamen.

%%

Literal %

Kein Parameter wird konsumiert.

4. Rückgabewert

Eine ECMDbResult-Instanz mit Spalten und Zeilen.

4.1. ECMDbResult

Attribut / Methode Typ Beschreibung

.columns

list[ECMDbColumn]

Geordnete Liste von Spaltendefinitionen, sortiert nach 1-basiertem Spaltenindex.

.rows

list[ECMDbRow]

Liste von Ergebniszeilen, eine pro <z:row>-Element.

len(result)

int

Anzahl der Zeilen.

for row in result

Iteriert direkt über .rows.

4.2. Felder von ECMDbColumn

Feld Typ Beschreibung

name

str

Spaltenname wie vom Server zurückgegeben.

number

int

1-basierter Spaltenindex.

data_type

str

ADO-Datentypstring, z. B. "string", "int", "dateTime".

max_length

int | None

Maximale Bytelänge laut Schema oder None, wenn nicht angegeben.

nullable

bool

Gibt an, ob die Spalte NULL-Werte erlaubt.

base_table

str | None

Quelltabellenname oder None, wenn nicht im Schema angegeben.

base_column

str | None

Quellspaltenname oder None, wenn nicht im Schema angegeben.

4.3. Zugriff auf ECMDbRow

Methode / Syntax Rückgabetyp Beschreibung

row["spaltenname"]

str | None

Raw-String-Wert oder None bei NULL.

row.get("spaltenname")

str | None

Wie getitem — Raw-String oder None bei fehlendem / NULL-Wert.

row.typed("spaltenname", str)

str | None

Wert in den angegebenen Typ konvertiert. Unterstützt: str, int, float, bool, datetime.

NULL-Werte werden immer als None zurückgegeben, unabhängig von der Zugriffsmethode.

5. Beispiele

5.1. Einfache Abfrage

  • Sync

  • Async

result = ecm.db.select("SELECT benutzer, osemail FROM benutzer")
print(f"{len(result)} Zeilen")
for row in result:
    print(row["benutzer"], row["osemail"])
result = await ecm.db.select("SELECT benutzer, osemail FROM benutzer")
print(f"{len(result)} Zeilen")
for row in result:
    print(row["benutzer"], row["osemail"])

5.2. Abfrage mit Parametern

  • Sync

  • Async

result = ecm.db.select(
    "SELECT id, benutzer FROM benutzer WHERE benutzer = %s AND aktiv = %d",
    "john",
    1,
)
for row in result:
    print(row["id"], row["benutzer"])
result = await ecm.db.select(
    "SELECT id, benutzer FROM benutzer WHERE benutzer = %s AND aktiv = %d",
    "john",
    1,
)
for row in result:
    print(row["id"], row["benutzer"])

5.3. Typisierter Wertzugriff

  • Sync

  • Async

result = ecm.db.select("SELECT benutzer, aktiv, logincount FROM benutzer")
for row in result:
    username: str | None = row.typed("benutzer", str)
    active: bool | None = row.typed("aktiv", bool)
    login_count: int | None = row.typed("logincount", int)
    print(username, active, login_count)
result = await ecm.db.select("SELECT benutzer, aktiv, logincount FROM benutzer")
for row in result:
    username: str | None = row.typed("benutzer", str)
    active: bool | None = row.typed("aktiv", bool)
    login_count: int | None = row.typed("logincount", int)
    print(username, active, login_count)

5.4. Dynamischer Tabellenname

  • Sync

  • Async

# %u fügt einen Identifier ohne Anführungszeichen ein — nur sichere Zeichen erlaubt
table = "benutzer"
result = ecm.db.select("SELECT * FROM %u WHERE id = %d", table, 42)
table = "benutzer"
result = await ecm.db.select("SELECT * FROM %u WHERE id = %d", table, 42)

5.5. Spalten-Metadaten auslesen

  • Sync

  • Async

result = ecm.db.select("SELECT * FROM benutzer WHERE 1 = 0")
for col in result.columns:
    print(col.name, col.data_type, col.max_length, col.nullable)
result = await ecm.db.select("SELECT * FROM benutzer WHERE 1 = 0")
for col in result.columns:
    print(col.name, col.data_type, col.max_length, col.nullable)

6. Siehe auch

  • ecm.db — Namespace-Übersicht mit SQL-Injection-Schutzhinweisen