[PYTHON] J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy

Ce que j'ai essayé

C'est un [Wiki.js] multifonctionnel (https://wiki.js.org/), mais je ne savais pas comment importer par lots des données existantes, j'ai donc essayé de forcer la mise à jour de la base de données. Ce n'est pas une méthode formelle, veuillez donc l'essayer à vos risques et périls.

procédure

--Préparation

Veuillez également vous référer à article GIGAZINE.

Préparation

Le travail est confirmé avec bash de macOS. Veuillez installer docker-compose et Python 3.8.

Lancez Wiki.js avec docker-compose

Il existe différentes méthodes de démarrage dans "Wiki.js --Docs", mais utilisez docker-compose. Commencez par créer 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

Si vous modifiez le port 5432 du côté local, remplacez «5432: 5432» par «15432: 5432» et modifiez également le 5432 suivant.

Lancement et connexion

Wiki.js commence par docker-compose up -d. L'arrêt est docker-compose down. Wiki.js est disponible sur http: // localhost /.

Créez un COMPTE ADMINISTRATEUR de manière appropriée. Connectez-vous ensuite avec le compte que vous avez créé.

Création de la page supérieure

Immédiatement après la connexion, il n'y a pas de pages. Commencez par créer la première page. Le chemin de la page d'accueil est / <language> / home. Au départ, vous ne pouvez utiliser que l'anglais (ʻen`) comme langue.

Ici, nous utiliserons le japonais (ja) comme langue. Tout d'abord, après avoir créé la page d'accueil en anglais, installez la langue japonaise, supprimez la page d'accueil en anglais et créez la page d'accueil en japonais.

Appuyez sur "+ CRÉER UNE PAGE D'ACCUEIL". Appuyez sur "Markdown", appuyez sur " ✓ OK ", puis appuyez sur" ✓ CREATE".

La page supérieure (http: // localhost / en / home) s'ouvre. Puisque vous êtes connecté en tant qu'administrateur, ouvrez l'écran de gestion (http: // localhost / a / dashboard) avec" " en haut à droite.

Sélectionnez " Locale "sur le côté gauche. Sélectionnez "Japonais" dans "" Télécharger les paramètres régionaux "" et appuyez sur "Télécharger" de la "flèche vers le bas sur le cloud". Revenez ensuite en arrière et réglez " Paramètres régionaux "sur" Japonais "et appuyez sur" ✓ APPLIQUER" en haut à droite.

Étant donné que l'espace de noms actif a été changé en japonais, la page supérieure doit être recréée en japonais. Sélectionnez " Page "sur le côté gauche. Sélectionnez l'élément dont le chemin est "en / home" et supprimez-le avec " Delete "de" ʻACTIONS v` ".

Cliquez sur «Fermer» en haut à droite pour revenir au premier écran, veuillez donc créer une page d'accueil japonaise.

Créer un environnement SQL Alchemy localement

Wiki.js vous permet de créer des articles dans un navigateur, mais ici nous allons essayer de créer un article en éditant la base de données directement depuis Python. Tout d'abord, créez un environnement virtuel Python.

bash


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

Créer une classe à partir de la base de données

Créez une classe à utiliser avec SQLAlchemy à partir de la base de données. Exécutez ce qui suit pour créer db_class.py.

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

Créer un article avec SQL Alchemy

Commencez par créer un fichier.

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"Page de test{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

Ci-dessus, créez main.py. python main.py crée une page vide appelée Page de test ....

Le contenu est décrit dans «Pages.content» et «Pages.render». Il ne sera pas affiché s'il est simplement décrit dans le contenu, mais il sera affiché s'il est modifié et enregistré.

sauvegarde

Vous pouvez vider le contenu de la base de données avec pg_dump -h localhost -p 5432 -U wikijs wiki -f data.sql.

Vous pouvez utiliser psql -h host -p 5432 -U user database -f data.sql pour renvoyer des données à un PostgreSQL vide.

Recommended Posts

J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de trouver la classe alternative avec tensorflow
J'ai essayé de créer un environnement à vérifier régulièrement en utilisant Selenium avec AWS Fargate
J'ai essayé de créer un environnement avec WSL + Ubuntu + VS Code dans un environnement Windows
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai essayé de créer une classe pour rechercher des fichiers avec la méthode Glob de Python dans VBA
J'ai essayé d'expliquer comment obtenir le contenu de l'article avec l'API MediaWiki d'une manière facile à comprendre avec des exemples (Python 3)
J'ai essayé de créer un environnement de MkDocs sur Amazon Linux
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
J'ai essayé de faire 5 modèles de base d'analyse en 3 ans
J'ai essayé de créer des taureaux et des vaches avec un programme shell
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé de me connecter automatiquement à Twitter avec du sélénium (RPA, scraping)
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai essayé de créer un linebot (implémentation)
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'envoyer un SMS avec Twilio
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé d'implémenter la permutation en Python
J'ai essayé de créer un linebot (préparation)
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter PPO en Python
J'ai essayé de construire un modèle d'estimation des titres d'articles susceptibles de faire le buzz avec Qiita
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
J'ai créé un capteur d'ouverture / fermeture (lien Twitter) avec TWE-Lite-2525A
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Development] (2/3)
J'ai essayé de résumer Cpaw Level1 & Level2 Write Up d'une manière facile à comprendre
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Execution] (3/3)
J'ai essayé de créer le téléchargement CSV, le traitement des données, la fonction de téléchargement avec Django
[Outlook] J'ai essayé de créer automatiquement un e-mail de rapport quotidien avec Python
J'ai essayé de créer un plug-in avec HULFT IoT Edge Streaming [Setup] (1/3)
Je souhaite créer un profil utilisateur Ubuntu Chrome avec Colab uniquement
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de déplacer GAN (mnist) avec keras
J'ai essayé d'obtenir une image en grattant
J'ai essayé de sauvegarder les données avec discorde
Je veux créer une fenêtre avec Python
J'ai essayé de détecter rapidement un mouvement avec OpenCV
Je veux être OREMO avec setParam!
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé d'implémenter TOPIC MODEL en Python
Créer une image avec des caractères avec python (japonais)
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'utiliser Linux avec Discord Bot
J'ai essayé d'envoyer un email avec SendGrid + Python