v0.1-alpha
DynamicModel
DynamicModel ist eine kleine Python-ORM-ähnliche Hilfsklasse für PostgreSQL (via psycopg2), mit der du
- eine Verbindung aufbauen
- Tabellen dynamisch anlegen
- neue Datensätze erstellen (Spalten werden bei Bedarf automatisch als
TEXTergänzt) - anhand von Spaltenwerten alle passenden
ids finden - dynamisch auf Spalten zugreifen und neue Spalten per Attributszuweisung erstellen können
Inhalt
- Installation
- Verbindung aufbauen
- Tabelle anlegen
- Datensatz erstellen
- IDs finden
- Mit Datensätzen arbeiten
- API-Reference
Installation
Stelle sicher, dass du psycopg2 installiert hast:
pip install psycopg2Dann importiere die Klasse:
from dynamic_model import DynamicModel(oder füge den Code direkt in dein Projekt ein)
Verbindung aufbauen
Bevor du irgendetwas mit der Datenbank machst, musst du die Verbindung konfigurieren:
DynamicModel.connect(
dbname="meine_db",
user="postgres",
password="geheim",
host="localhost",
port=5432
)Ab jetzt steht DynamicModel._connection allen Methoden zur Verfügung.
Tabelle anlegen
Eine neue Tabelle erzeugst du mit einem Namenspaar und einem Schema-Dictionary:
DynamicModel.create_table(
"users",
{
"username": "TEXT NOT NULL UNIQUE",
"email": "TEXT",
"active": "BOOLEAN DEFAULT TRUE"
}
)Intern wird automatisch eine Spalte
id SERIAL PRIMARY KEYhinzugefügt.
Datensatz erstellen
Um einen neuen Datensatz einzufügen:
user = DynamicModel.create(
"users",
username="homer",
email="homer@springfield.com",
active="true"
)
print("Neue ID:", user._id) # z.B. 1
print("Username:", user.username) # "homer"Fehlende Spalten im Schema werden automatisch als TEXT hinzugefügt.
IDs finden
Mit find_ids() kannst du per AND-Verknüpfung nach IDs suchen:
# alle aktiven User
ids_active = DynamicModel.find_ids("users", active="true")
# User mit username='homer' und active='true'
ids_homer = DynamicModel.find_ids("users",
username="homer",
active="true")Die Methode gibt eine Liste von Ganzzahlen zurück.
Mit Datensätzen arbeiten
Nach dem create() oder wenn du ein existierendes Objekt lädst…
user = DynamicModel("users", 1)kannst du:
- Ein vorhandenes Feld lesen:
print(user.email)
- Ein vorhandenes Feld schreiben (speichert sofort in der DB):
user.email = "homer@newmail.com"
- Ein neues Feld per Attribut anlegen (legt automatisch eine
TEXT-Spalte an und schreibt den Wert):user.favourite_donut = "Glazed" print(user.favourite_donut)
Möchtest du mehrere Änderungen gesammelt speichern, kannst du save() aufrufen:
user.username = "homer_simpson"
user.active = "false"
user.save()API Reference
connect(**db_params)
Richtet die globale DB-Verbindung ein.
Parameter
dbname(str)user(str)password(str)host(str)port(int)
DynamicModel.connect(
dbname="db",
user="usr",
password="pw",
host="localhost",
port=5432
)create_table(table: str, schema: dict)
Erzeugt eine neue Tabelle (falls nicht existiert).
table: Tabellennameschema: Dict aus Spaltenname → SQL-Typ
DynamicModel.create_table(
"products",
{"name":"TEXT", "price":"NUMERIC"}
)create(table: str, **kwargs) → DynamicModel
Fügt einen Datensatz ein. Fehlende Spalten werden als TEXT erstellt.
Gibt das neue Objekt zurück.
p = DynamicModel.create("products",
name="Donut",
price="1.50")find_ids(table: str, **conditions) → List[int]
Sucht in table alle Zeilen, die alle Bedingungen erfüllen.
Rückgabe: Liste der id-Werte.
ids = DynamicModel.find_ids("users",
active="true",
email="homer@springfield.com")init(table: str, row_id: int)
Lädt eine bestehende Zeile (Spalten + Werte) aus der DB.
user = DynamicModel("users", 1)getattr(name)
Gibt den Wert der Spalte name zurück, falls vorhanden, sonst AttributeError.
setattr(name, value)
- Wenn
nameeine existierende Spalte ist, wird sofort einUPDATEausgeführt. - Andernfalls wird eine neue
TEXT-Spalte angelegt und befüllt.
save()
Speichert alle Spalten (außer id) im Batch. Nützlich, wenn _data manuell verändert wurde.
user.username = "bart"
user.email = "bart@simpsons.com"
# …
user.save()Komplettes Beispiel
from dynamic_model import DynamicModel
# 1) connect
DynamicModel.connect(dbname="demo",
user="postgres",
password="geheim",
host="localhost",
port=5432)
# 2) Tabelle anlegen
DynamicModel.create_table("users", {
"username":"TEXT NOT NULL UNIQUE",
"email": "TEXT",
"active": "BOOLEAN DEFAULT TRUE"
})
# 3) Datensätze erstellen
DynamicModel.create("users",
username="alice",
email="alice@example.com",
active="true")
DynamicModel.create("users",
username="bob",
email="bob@example.com",
active="false")
# 4) IDs finden
print(DynamicModel.find_ids("users", active="true")) # z.B. [1]
# 5) Objekt laden & dynamisch arbeiten
u = DynamicModel("users", 1)
print(u.username) # "alice"
u.nickname = "Allie" # neue Spalte + Wert
print(u.nickname) # "Allie"
# 6) Mehr Änderungen & batch-save
u.email = "alice@new.com"
u.active = "false"
u.save()