Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
H
HHZVideoAnalytics
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Daniel Rafeh
HHZVideoAnalytics
Commits
33f8f9f7
Commit
33f8f9f7
authored
5 months ago
by
Wasilios Gotsis
Browse files
Options
Downloads
Patches
Plain Diff
Edit database.py
parent
10e35298
No related branches found
No related tags found
No related merge requests found
Pipeline
#20807
passed
5 months ago
Stage: test
Changes
1
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/database.py
+149
-0
149 additions, 0 deletions
src/database.py
with
149 additions
and
0 deletions
src/database.py
+
149
−
0
View file @
33f8f9f7
import
mysql.connector
from
mysql.connector
import
errorcode
# --- MySQL Server Konfiguration ---
DB_CONFIG
=
{
'
host
'
:
'
localhost
'
,
# z.B. 'localhost' oder Ihre DB-Server-IP
'
user
'
:
'
your_mysql_user
'
,
# Ihr MySQL-Benutzername
'
password
'
:
'
your_mysql_password
'
,
# Ihr MySQL-Passwort
'
database
'
:
'
hhz_video_analytics
'
# Der Name Ihrer Datenbank
}
TABLES
=
{}
# Tabelle für Video-Metadaten
TABLES
[
'
Videos
'
]
=
(
"
CREATE TABLE IF NOT EXISTS `Videos` (
"
"
`video_id` INT AUTO_INCREMENT PRIMARY KEY,
"
"
`youtube_url` VARCHAR(512) NOT NULL UNIQUE,
"
"
`title` VARCHAR(255) DEFAULT NULL,
"
"
`duration_seconds` INT DEFAULT NULL,
"
"
`downloaded_filepath` VARCHAR(1024) DEFAULT NULL,
"
"
`resolution_width` INT DEFAULT NULL,
"
"
`resolution_height` INT DEFAULT NULL,
"
"
`fps` FLOAT DEFAULT NULL,
"
"
`analysis_status` ENUM(
'
pending
'
,
'
downloading
'
,
'
processing_frames
'
,
'
processing_yolo
'
,
'
completed
'
,
'
failed
'
)
"
"
NOT NULL DEFAULT
'
pending
'
,
"
"
`processed_at` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
"
"
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
"
"
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
"
)
# Tabelle für extrahierte Frames
TABLES
[
'
Frames
'
]
=
(
"
CREATE TABLE IF NOT EXISTS `Frames` (
"
"
`frame_id` INT AUTO_INCREMENT PRIMARY KEY,
"
"
`video_id` INT NOT NULL,
"
"
`frame_timestamp_sec` DECIMAL(10, 3) NOT NULL,
"
# z.B. 123.456 Sekunden
"
`frame_filepath` VARCHAR(1024) DEFAULT NULL,
"
# Pfad zum gespeicherten Frame-Bild
"
`width` INT DEFAULT NULL,
"
# tatsächliche Breite des Frames
"
`height` INT DEFAULT NULL,
"
# tatsächliche Höhe des Frames
"
`processed_yolo_v8` BOOLEAN NOT NULL DEFAULT FALSE,
"
# Status ob YOLOv8 Analyse erfolgt ist
"
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"
"
FOREIGN KEY (`video_id`)
"
"
REFERENCES `Videos`(`video_id`)
"
"
ON DELETE CASCADE,
"
# Wenn ein Video gelöscht wird, werden auch die zugehörigen Frames gelöscht
"
INDEX `idx_video_id_timestamp` (`video_id`, `frame_timestamp_sec`)
"
# Index für häufige Abfragen
"
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
"
)
# Tabelle für YOLOv8 Detektionen
TABLES
[
'
DetectionsYOLOv8
'
]
=
(
"
CREATE TABLE IF NOT EXISTS `DetectionsYOLOv8` (
"
"
`detection_id` INT AUTO_INCREMENT PRIMARY KEY,
"
"
`frame_id` INT NOT NULL,
"
"
`class_id` INT NOT NULL,
"
# YOLOv8 numerische Klassen-ID
"
`class_name` VARCHAR(100) NOT NULL,
"
# YOLOv8 Klassenname (z.B. 'car', 'person')
"
`confidence` FLOAT NOT NULL,
"
# Konfidenzwert der Detektion (0.0 bis 1.0)
"
`x_center` INT NOT NULL,
"
# Mittelpunkt X der Bounding Box
"
`y_center` INT NOT NULL,
"
# Mittelpunkt Y der Bounding Box
"
`width` INT NOT NULL,
"
# Breite der Bounding Box
"
`height` INT NOT NULL,
"
# Höhe der Bounding Box
"
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
"
"
FOREIGN KEY (`frame_id`)
"
"
REFERENCES `Frames`(`frame_id`)
"
"
ON DELETE CASCADE,
"
# Wenn ein Frame gelöscht wird, werden auch die Detektionen gelöscht
"
INDEX `idx_frame_id` (`frame_id`),
"
"
INDEX `idx_class_name` (`class_name`)
"
# Index für Abfragen nach bestimmten Objekten
"
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
"
)
# Optionale Tabelle für aggregierte Analysen pro Video
TABLES
[
'
VideoAnalyticsSummary
'
]
=
(
"
CREATE TABLE IF NOT EXISTS `VideoAnalyticsSummary` (
"
"
`summary_id` INT AUTO_INCREMENT PRIMARY KEY,
"
"
`video_id` INT NOT NULL UNIQUE,
"
# Stellt sicher, dass es nur einen Summary-Eintrag pro Video gibt
"
`most_frequent_object_yolo` VARCHAR(100) DEFAULT NULL,
"
"
`object_counts_json_yolo` JSON DEFAULT NULL,
"
# Speichert ein JSON-Objekt mit {object_name: count}
"
`llm_generated_description` TEXT DEFAULT NULL,
"
"
`average_objects_per_frame_yolo` FLOAT DEFAULT NULL,
"
"
`custom_stat_placeholder_1` VARCHAR(255) DEFAULT NULL,
"
# Für zukünftige Erweiterungen
"
`last_updated` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
"
"
FOREIGN KEY (`video_id`)
"
"
REFERENCES `Videos`(`video_id`)
"
"
ON DELETE CASCADE
"
"
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
"
)
def
create_database_if_not_exists
(
cursor
,
db_name
):
try
:
cursor
.
execute
(
f
"
CREATE DATABASE IF NOT EXISTS `
{
db_name
}
` DEFAULT CHARACTER SET
'
utf8mb4
'
COLLATE
'
utf8mb4_unicode_ci
'"
)
print
(
f
"
Datenbank
'
{
db_name
}
'
erfolgreich erstellt oder existiert bereits.
"
)
except
mysql
.
connector
.
Error
as
err
:
print
(
f
"
Fehler beim Erstellen der Datenbank
'
{
db_name
}
'
:
{
err
}
"
)
exit
(
1
)
def
create_tables
(
cursor
):
for
table_name
,
table_description
in
TABLES
.
items
():
try
:
print
(
f
"
Erstelle Tabelle
'
{
table_name
}
'
...
"
,
end
=
''
)
cursor
.
execute
(
table_description
)
print
(
"
OK
"
)
except
mysql
.
connector
.
Error
as
err
:
if
err
.
errno
==
errorcode
.
ER_TABLE_EXISTS_ERROR
:
print
(
"
existiert bereits.
"
)
else
:
print
(
f
"
Fehler:
{
err
.
msg
}
"
)
else
:
pass
# Tabelle erfolgreich erstellt oder existierte bereits
def
main
():
cnx
=
None
# Initialisiere cnx außerhalb des try-Blocks
try
:
# Zuerst ohne Angabe der Datenbank verbinden, um sie ggf. zu erstellen
temp_cnx
=
mysql
.
connector
.
connect
(
host
=
DB_CONFIG
[
'
host
'
],
user
=
DB_CONFIG
[
'
user
'
],
password
=
DB_CONFIG
[
'
password
'
]
)
cursor
=
temp_cnx
.
cursor
()
create_database_if_not_exists
(
cursor
,
DB_CONFIG
[
'
database
'
])
temp_cnx
.
database
=
DB_CONFIG
[
'
database
'
]
# Wechsle zur erstellten/existierenden DB
cursor
.
close
()
temp_cnx
.
close
()
# Jetzt mit der spezifizierten Datenbank verbinden
cnx
=
mysql
.
connector
.
connect
(
**
DB_CONFIG
)
cursor
=
cnx
.
cursor
()
print
(
f
"
\n
Erfolgreich mit MySQL-Datenbank
'
{
DB_CONFIG
[
'
database
'
]
}
'
verbunden.
"
)
create_tables
(
cursor
)
except
mysql
.
connector
.
Error
as
err
:
if
err
.
errno
==
errorcode
.
ER_ACCESS_DENIED_ERROR
:
print
(
"
Zugriff verweigert. Überprüfen Sie Benutzername und Passwort.
"
)
elif
err
.
errno
==
errorcode
.
ER_BAD_DB_ERROR
:
print
(
f
"
Datenbank
'
{
DB_CONFIG
[
'
database
'
]
}
'
existiert nicht und konnte nicht erstellt werden (oder keine Berechtigung).
"
)
else
:
print
(
f
"
Ein MySQL-Fehler ist aufgetreten:
{
err
}
"
)
finally
:
if
cnx
and
cnx
.
is_connected
():
cursor
.
close
()
cnx
.
close
()
print
(
"
\n
MySQL-Verbindung geschlossen.
"
)
if
__name__
==
"
__main__
"
:
print
(
"
Starte Skript zum Erstellen des Datenbankschemas...
"
)
main
()
\ No newline at end of file
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
sign in
to comment