initial commit
This commit is contained in:
67
server/init_database.py
Normal file
67
server/init_database.py
Normal file
@@ -0,0 +1,67 @@
|
||||
from sqlalchemy import create_engine, Column, Integer, String, Enum, TIMESTAMP, func, text
|
||||
from sqlalchemy.orm import sessionmaker, declarative_base
|
||||
import enum
|
||||
import bcrypt
|
||||
|
||||
# Basis-Klasse für unsere Modelle
|
||||
Base = declarative_base()
|
||||
|
||||
# Enum zur Definition der möglichen Rollen
|
||||
class UserRole(enum.Enum):
|
||||
user = "user"
|
||||
admin = "admin"
|
||||
superadmin = "superadmin"
|
||||
|
||||
# Definition des User Models (Tabelle)
|
||||
class User(Base):
|
||||
__tablename__ = 'users'
|
||||
|
||||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||
username = Column(String(50), unique=True, nullable=False)
|
||||
password_hash = Column(String(60), nullable=False) # bcrypt erzeugt einen 60-Zeichen-Hash
|
||||
role = Column(Enum(UserRole), nullable=False, default=UserRole.user)
|
||||
created_at = Column(TIMESTAMP, server_default=func.current_timestamp())
|
||||
updated_at = Column(TIMESTAMP, server_default=func.current_timestamp(), onupdate=func.current_timestamp())
|
||||
|
||||
# Definition des Client Models (Tabelle)
|
||||
class Client(Base):
|
||||
__tablename__ = 'clients'
|
||||
|
||||
# Die UUID wird vom Client erzeugt und muss daher übermittelt werden (kein Default)
|
||||
uuid = Column(String(36), primary_key=True, nullable=False)
|
||||
# Der Hardware-Hash wird ebenfalls direkt vom Client geliefert
|
||||
hardware_hash = Column(String(64), nullable=False)
|
||||
# Spalte für den Standort, der vom Benutzer bei der Anmeldung eingegeben wird
|
||||
location = Column(String(100), nullable=True)
|
||||
# Spalte für die IP-Adresse, die vom Server beim Kontakt ermittelt wird
|
||||
ip_address = Column(String(45), nullable=True)
|
||||
# Speicherung des Registrierungszeitpunkts, wird automatisch gesetzt
|
||||
registration_time = Column(TIMESTAMP, server_default=func.current_timestamp(), nullable=False)
|
||||
# Speicherung des Zeitpunkts der letzten Rückmeldung (Alive-Signal)
|
||||
last_alive = Column(
|
||||
TIMESTAMP,
|
||||
server_default=func.current_timestamp(),
|
||||
onupdate=func.current_timestamp(),
|
||||
nullable=False
|
||||
)
|
||||
|
||||
def main():
|
||||
# Zuerst Verbindung zur MariaDB ohne spezifische Datenbank, um die Datenbank anzulegen.
|
||||
admin_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa'
|
||||
admin_engine = create_engine(admin_connection_str, echo=True)
|
||||
|
||||
# Datenbank "infoscreen_by_taa" anlegen, falls sie noch nicht existiert.
|
||||
with admin_engine.connect() as conn:
|
||||
conn.execute(text("CREATE DATABASE IF NOT EXISTS infoscreen_by_taa CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"))
|
||||
|
||||
# Verbindung zur spezifischen Datenbank herstellen.
|
||||
db_connection_str = 'mysql+pymysql://infoscreen_admin:KqtpM7wmNd$M1Da&mFKs@infoscreen-db/infoscreen_by_taa'
|
||||
engine = create_engine(db_connection_str, echo=True)
|
||||
|
||||
# Erstelle die Tabellen 'users' und 'clients'
|
||||
Base.metadata.create_all(engine)
|
||||
|
||||
print("Die Tabellen 'users' und 'clients' wurden in der Datenbank 'infoscreen_by_taa' erstellt.")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user