[PYTHON] Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen

Was ich versucht habe

Es ist ein multifunktionales Wiki.js, aber ich wusste nicht, wie ich vorhandene Daten stapelweise importieren soll, deshalb habe ich versucht, die Aktualisierung der Datenbank zu erzwingen. Dies ist keine formale Methode. Versuchen Sie es daher auf eigenes Risiko.

Verfahren

--Vorbereitung

Bitte lesen Sie auch GIGAZINE-Artikel.

Vorbereitung

Die Arbeit wird mit bash von macOS bestätigt. Bitte haben Sie Docker-Compose und Python 3.8 installiert.

Starten Sie Wiki.js mit Docker-Compose

Es gibt verschiedene Startmethoden in "Wiki.js --Docs", aber verwenden Sie Docker-Compose. Erstellen Sie zunächst docker-compose.yml.

bash


mkdir wikijs
cd wikijs
cat << EOF > docker-compose.yaml
version: "3"
services:

  db:
    image: postgres:11-alpine
    environment:
      POSTGRES_DB: wiki
      POSTGRES_PASSWORD: wikijsrocks
      POSTGRES_USER: wikijs
    ports:
      - "5432:5432"
    logging:
      driver: "none"
    restart: unless-stopped
    volumes:
      - db-data:/var/lib/postgresql/data

  wiki:
    image: requarks/wiki:2
    depends_on:
      - db
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: wikijsrocks
      DB_NAME: wiki
    restart: unless-stopped
    ports:
      - "80:3000"

volumes:
  db-data:
EOF

Wenn Sie den Port 5432 auf der lokalen Seite ändern, ändern Sie "5432: 5432" in "15432: 5432" und ändern Sie auch den nachfolgenden 5432.

Starten & Anmelden

Wiki.js beginnt mit docker-compose up -d. Der Stopp ist "Docker-Compose Down". Wiki.js ist unter http: // localhost / verfügbar.

Erstellen Sie das ADMINISTRATOR-KONTO entsprechend. Melden Sie sich dann mit dem von Ihnen erstellten Konto an.

Erstellung der oberen Seite

Unmittelbar nach dem Anmelden gibt es keine Seiten. Erstellen Sie zunächst die oberste Seite. Der Pfad der oberen Seite lautet "/ / home". Zunächst können Sie nur Englisch (en) als Sprache verwenden.

Hier werden wir Japanisch (ja) als Sprache verwenden. Installieren Sie nach dem Erstellen der englischen Top-Seite zunächst die japanische Sprache, löschen Sie die englische Top-Seite und erstellen Sie die japanische Top-Seite.

Drücken Sie " + HOME PAGE ERSTELLEN ". Drücken Sie "Markdown", drücken Sie " ✓ OK "und dann" ✓ CREATE".

Die oberste Seite (http: // localhost / de / home) wird geöffnet. Da Sie als Administrator angemeldet sind, öffnen Sie den Verwaltungsbildschirm (http: // localhost / a / dashboard) mit" " oben rechts.

Wählen Sie " Locale "auf der linken Seite. Wählen Sie "Japanisch" aus "Download-Gebietsschema" und klicken Sie auf "Download" der "Abwärtspfeilmarkierung in der Cloud". Gehen Sie dann zurück nach oben und setzen Sie " Locale Settings "auf" Japanese "und drücken Sie oben rechts auf" ✓ APPLY".

Da der aktive Namespace in Japanisch geändert wurde, muss die obere Seite auf Japanisch neu erstellt werden. Wählen Sie " Seite "auf der linken Seite. Wählen Sie das Element aus, dessen Pfad "en / home" ist, und löschen Sie es mit " Delete "von" ACTIONS v".

Klicken Sie oben rechts auf "Schließen", um zum ersten Bildschirm zurückzukehren. Erstellen Sie daher eine japanische Startseite.

Erstellen Sie die SQL Alchemy-Umgebung lokal

Mit Wiki.js können Sie Artikel in Ihrem Browser erstellen. Hier werden wir jedoch versuchen, Artikel zu erstellen, indem Sie die Datenbank direkt in Python bearbeiten. Erstellen Sie zunächst eine virtuelle Python-Umgebung.

bash


python3.8 -m venv venv
source venv/bin/activate
pip install psycopg2-binary SQLAlchemy

Klasse aus Datenbank erstellen

Erstellen Sie eine Klasse aus der Datenbank zur Verwendung mit SQLAlchemy. Führen Sie die folgenden Schritte aus, um "db_class.py" zu erstellen.

bash


cat << EOF | python
import re

from sqlalchemy import MetaData, create_engine
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine("postgresql+psycopg2://wikijs:wikijsrocks@localhost:5432/wiki")

metadata = MetaData()
metadata.reflect(engine)

Base = declarative_base(metadata=metadata)


def _subfunc(m):
    s = ".".join(m.group(1).split(".")[-2:])
    return rf"ForeignKey('{s}')"


def make_class(cls):
    lst = [f"class {str(cls).split('.')[-1][:-2]}(Base):"]
    lst.append(f'    __tablename__ = "{cls.__tablename__}"\n')
    for column in cls.__table__.columns:
        s = repr(column)
        nam = s.split("'")[1]
        s = re.sub(r", table=[^>]+>", "", s)
        s = re.sub(r", server_default=[^)]+\)", "", s)
        s = re.sub(r"ForeignKey\('([^']+)'\)", _subfunc, s)
        lst.append(f"    {nam} = {s}")
    res = "\n".join(lst) + "\n"
    res = res.replace("metadata = Column", "metadata_ = Column")
    return res


def make_classes():
    lst = [
        """\
# made by make_classes
from typing import Any
from sqlalchemy import Column, ForeignKey, Text
from sqlalchemy.dialects.postgresql import (
    BOOLEAN, BYTEA, INTEGER, JSON, TEXT, TIMESTAMP, VARCHAR
)
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()  # type: Any
"""
    ]
    dc = {"__table_args__": {"autoload": True}}
    for tbl in sorted(metadata.tables):
        if tbl in {"brute"}:
            continue
        typ = type(tbl.title(), (Base,), dict(__tablename__=tbl, **dc))
        lst.append(make_class(typ))
    with open("db_class.py", "w") as fp:
        fp.write("\n".join(lst))


make_classes()
EOF

Erstellen Sie einen Artikel mit SQL Alchemy

Erstellen Sie zunächst eine Datei.

bash


cat << EOF > main.py
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from db_class import *

engine = create_engine("postgresql+psycopg2://wikijs:wikijsrocks@localhost:5432/wiki")
Session = sessionmaker(bind=engine)
session = Session()
pgid = max(i.id for i in session.query(Pages).all()) + 1
ptid = max(i.id for i in session.query(Pagetree).all()) + 1
pg = Pages(
    id=pgid,
    path=f"test{pgid}",
    hash="0123456789001234567890abcdefghijklmnopqr",
    title=f"Testseite{pgid}",
    isPrivate=False,
    isPublished=True,
    content="",
    contentType="markdown",
    createdAt="2020-10-04T09:00:00.000Z",
    updatedAt="2020-10-04T09:00:00.000Z",
    editorKey="markdown",
    localeCode="ja",
    description="",
    authorId=1,
    creatorId=1,
    render="<div></div>",
    toc=[{"title": "", "anchor": "", "children": []}],
    extra={"js": "", "css": ""},
    publishStartDate="",
    publishEndDate="",
)
pt = Pagetree(
    id=ptid,
    path=pg.path,
    localeCode="ja",
    pageId=pgid,
    title=pg.title,
    depth=1,
    isPrivate=False,
    isFolder=False,
    ancestors=[],
)
session.add(pg)
session.add(pt)
session.commit()
session.close()
EOF

Erstellen Sie oben main.py. python main.py erstellt eine leere Seite namens Test Page ....

Der Inhalt wird in "Pages.content" und "Pages.render" beschrieben. Es wird nicht angezeigt, wenn es nur im Inhalt beschrieben wird, aber es wird angezeigt, wenn es bearbeitet und gespeichert wird.

Backup

Sie können den Inhalt der Datenbank mit pg_dump -h localhost -p 5432 -U wikijs wiki -f data.sql sichern.

Sie können psql -h host -p 5432 -U Benutzerdatenbank -f data.sql verwenden, um Daten an ein leeres PostgreSQL zurückzugeben.

Recommended Posts

Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden
Ich habe versucht, eine Umgebung zu erstellen, um regelmäßig mit Selenium mit AWS Fargate zu überprüfen
Ich habe versucht, eine Umgebung mit WSL + Ubuntu + VS-Code in einer Windows-Umgebung zu erstellen
Ich habe versucht, API list.csv mit Python aus swagger.yaml zu erstellen
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Ich habe versucht, eine Klasse für die Suche nach Dateien mit der Glob-Methode von Python in VBA zu erstellen
Ich habe versucht zu erklären, wie der Artikelinhalt mit der MediaWiki-API auf leicht verständliche Weise anhand von Beispielen abgerufen werden kann (Python 3).
Ich habe versucht, eine Umgebung von MkDocs unter Amazon Linux zu erstellen
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, das Bild mit OpenCV im "Skizzenstil" zu verarbeiten
Ich habe versucht, in 3 Jahren 5 Muster der Analysebasis zu erstellen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
Ich habe versucht, das Bild mit OpenCV im "Bleistift-Zeichenstil" zu verarbeiten
Ich habe versucht, mich automatisch mit Selen bei Twitter anzumelden (RPA, Scraping)
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, PPO in Python zu implementieren
Ich habe versucht, ein Schätzmodell für Artikeltitel zu erstellen, die wahrscheinlich mit Qiita in Einklang stehen
[Python] Ich habe versucht, den kollektiven Typ (Satz) auf leicht verständliche Weise zusammenzufassen.
Ich habe mit TWE-Lite-2525A einen Öffnungs- / Schließsensor (Twitter-Link) erstellt
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Entwicklung] (2/3) zu erstellen.
Ich habe versucht, Cpaw Level1 & Level2 Write Up auf leicht verständliche Weise zusammenzufassen
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Ausführung] (3/3) zu erstellen.
Ich habe versucht, mit Django eine CSV-Upload-, Datenverarbeitungs- und Download-Funktion zu erstellen
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
Ich habe versucht, ein Plug-In mit HULFT IoT Edge Streaming [Setup] (1/3) zu erstellen.
Ich möchte ein Ubuntu Chrome-Benutzerprofil nur mit Colab erstellen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, durch Schaben ein Bild zu bekommen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich möchte mit Python ein Fenster erstellen
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich möchte OREMO mit setParam sein!
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, TOPIC MODEL in Python zu implementieren
Erstellen Sie ein Bild mit Zeichen mit Python (Japanisch)
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden