131 lines
3.9 KiB
Python
131 lines
3.9 KiB
Python
import os
|
|
import json
|
|
import pymysql
|
|
from pymysql.cursors import DictCursor
|
|
|
|
# DB Connection Config
|
|
DB_HOST = os.getenv("MARIADB_HOST", "db")
|
|
DB_USER = os.getenv("MARIADB_USER", "crumb")
|
|
DB_PASS = os.getenv("MARIADB_PASSWORD", "secret")
|
|
DB_NAME = os.getenv("MARIADB_DATABASE", "crumbcrm")
|
|
|
|
def get_db():
|
|
print(f"🔌 Connecting to {DB_HOST}...")
|
|
return pymysql.connect(
|
|
host=DB_HOST,
|
|
user=DB_USER,
|
|
password=DB_PASS,
|
|
database=DB_NAME,
|
|
autocommit=True,
|
|
charset="utf8mb4",
|
|
cursorclass=DictCursor,
|
|
)
|
|
|
|
DUMMY_POSTS = [
|
|
{
|
|
"title": "Was ist RAG? 🤖",
|
|
"slug": "was-ist-rag",
|
|
"locale": "de",
|
|
"excerpt": "Retrieval Augmented Generation einfach erklärt. Warum unser Wald ein Gedächtnis braucht.",
|
|
"tags": ["RAG", "Tech", "Grundlagen"],
|
|
"author": "System",
|
|
"body_md": """# Was ist RAG?
|
|
|
|
RAG steht für **Retrieval Augmented Generation**.
|
|
|
|
Stell dir vor, du schreibst eine Prüfung.
|
|
* **Ohne RAG**: Du musst alles auswendig wissen (wie ein LLM, das nur sein Training kennt).
|
|
* **Mit RAG**: Du darfst in einem offenen Lehrbuch nachschlagen.
|
|
|
|
## Im Crumbforest
|
|
Unser "Lehrbuch" ist die Vektordatenbank (Qdrant).
|
|
Wenn du fragst *"Was steht im Tagebuch von Schnippsi?"*, suchen wir erst die passenden Seiten und geben sie der KI.
|
|
|
|
So halluziniert die KI weniger und kennt deine privaten Daten!"""
|
|
},
|
|
{
|
|
"title": "Die Eule erklärt: JSON in MariaDB 🦉",
|
|
"slug": "eule-json-mariadb",
|
|
"locale": "de",
|
|
"excerpt": "Wussten Sie, dass SQL und NoSQL Freunde sein können? Professor Eule klärt auf.",
|
|
"tags": ["Database", "SQL", "Eule"],
|
|
"author": "Professor Eule",
|
|
"body_md": """# JSON Spalten in SQL
|
|
|
|
Huhu! 🦉
|
|
|
|
Viele denken, man muss sich entscheiden: SQL (strikt) oder NoSQL (flexibel).
|
|
Aber **MariaDB** erlaubt uns beides!
|
|
|
|
Wir speichern Tags einfach als JSON:
|
|
```json
|
|
["RAG", "SQL", "Eule"]
|
|
```
|
|
|
|
## Warum?
|
|
* Es ist schnell.
|
|
* Wir brauchen keine extra `tags` Tabelle mit komplizierten JOINS für einfache Listen.
|
|
* Wir können trotzdem darauf suchen: `JSON_CONTAINS(tags, '"Eule"')`.
|
|
|
|
Clever, oder? Hu-hu!"""
|
|
},
|
|
{
|
|
"title": "Neu im Wald: Der Blog ist da! 📰",
|
|
"slug": "neu-im-wald-blog",
|
|
"locale": "de",
|
|
"excerpt": "Endlich können wir Neuigkeiten teilen. Willkommen im 'Pulse' Bereich.",
|
|
"tags": ["News", "Community", "Update"],
|
|
"author": "Krümel",
|
|
"body_md": """# Willkommen beim Pulse
|
|
|
|
Das ist der neue Blog-Bereich ("Pulse").
|
|
Hier landen:
|
|
* Updates zum System
|
|
* Tutorials
|
|
* Gedanken aus dem Wald
|
|
|
|
## Tech-Stack
|
|
Diese Seite nutzt:
|
|
* **Jinja2** für HTML
|
|
* **PicoCSS** für das Design
|
|
* **MariaDB** als Content Store
|
|
|
|
Viel Spaß beim Lesen!"""
|
|
}
|
|
]
|
|
|
|
def seed():
|
|
conn = get_db()
|
|
with conn.cursor() as cur:
|
|
print("🌱 Seeding Posts...")
|
|
for post in DUMMY_POSTS:
|
|
# Check exist
|
|
cur.execute("SELECT id FROM posts WHERE slug=%s AND locale=%s", (post['slug'], post['locale']))
|
|
if cur.fetchone():
|
|
print(f" ⚠️ Skipping '{post['title']}' (already exists)")
|
|
continue
|
|
|
|
# Insert
|
|
cur.execute(
|
|
"""
|
|
INSERT INTO posts (title, slug, locale, excerpt, tags, author, body_md, is_published)
|
|
VALUES (%s, %s, %s, %s, %s, %s, %s, 1)
|
|
""",
|
|
(
|
|
post['title'],
|
|
post['slug'],
|
|
post['locale'],
|
|
post['excerpt'],
|
|
json.dumps(post['tags']),
|
|
post['author'],
|
|
post['body_md']
|
|
)
|
|
)
|
|
print(f" ✅ Created '{post['title']}'")
|
|
|
|
conn.close()
|
|
print("✨ Seeding complete.")
|
|
|
|
if __name__ == "__main__":
|
|
seed()
|