Seite 1 von 1

Automatisches Generieren von Views aus einer MySQL-Datenbank

Verfasst: Freitag 20. Februar 2015, 16:30
von pybus
Hallo Leute, ich würde gerne für jeden unterschiedlichen Eintrag, der in einer DB-Tabelle vorhanden ist, einen View erstellen. Als Beispiel hab ich eine Datenbank (aus einem MySQl-Tutorial :wink: ) der folgende Daten beinhaltet:
"name" "owner" "species" "sex" "birth" "death"
"Fluffy" "Harold" "cat" "f" "1993-02-04" "0000-00-00"
"Claws" "Gwen" "cat" "m" "1994-03-17" "0000-00-00"
"Buffy" "Harold" "dog" "f" "1989-05-13" "0000-00-00"
"Fang" "Benny" "dog" "m" "1990-08-27" "0000-00-00"
"Bowser" "Diane" "dog" "m" "1979-08-31" "1995-07-29"
"Chirpy" "Gwen" "bird" "f" "1998-09-11" "0000-00-00"
"Whistler" "Gwen" "bird" "" "1997-12-09" "0000-00-00"
"Slim" "Benny" "snake" "m" "1996-04-29" "0000-00-00"
Die Abfrage:
SELECT DISTINCT(OWNER) FROM pet;
liefert dann wie gewünscht die 4 Besitzer. Nun kann ich händisch einen View anlegen:
create view test as (select * from pet where owner="Harold");
Der dann den View anlegt mit den beiden Zeilen von dem Benutzer Harold. Nun hätte ich folgendes python-Skript zusammengeschrieben, welches jedoch eine Fehlermeldung rauswirft:

Code: Alles auswählen

import os
import time
import datetime
import MySQLdb as mdb
import mysql.connector

con=mdb.connect(user='root',host='localhost', passwd='', db='menagerie')
cur=con.cursor()
cur.execute("select distinct(Owner) from pet")
ver = cur.fetchall()
for record in ver:
    print record
    cur.execute('CREATE VIEW %s AS (SELECT * FROM pet WHERE OWNER="Harold")',(record))
Die Fehlermeldung:
('Harold',)

Traceback (most recent call last):
File "CreateViewsAusMac2.py", line 13, in <module>
cur.execute('CREATE VIEW %s AS (SELECT * FROM pet WHERE OWNER="Harold")',(record))
File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 174, in execute
self.errorhandler(self, exc, value)
File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near \'\'Harold\' AS (SELECT * FROM pet WHERE OWNER="Harold")\' at line 1')
Jetzt scheint es ja so zu sein, dass die einzelnen Spalten niht einwandfrei getrennt sind. Muss ich hier eventuell erst noch den varchar-Typ umwandeln?

Freue mich auf Antworten, viele Grüße! ;)

Re: Automatisches Generieren von Views aus einer MySQL-Daten

Verfasst: Freitag 20. Februar 2015, 17:35
von EyDu
"execute" kann nur Werte einfügen, für Spaltennamen oder Namen von Views geht das nicht. Wenn du ganz genau hinschaust, dann siehst du das auch in der letzten Zeile der Fehlermeldung. Die ganzen \' sind natürlich ein wenig unübersichtlich.

Re: Automatisches Generieren von Views aus einer MySQL-Daten

Verfasst: Freitag 20. Februar 2015, 18:22
von Hyperion
Mich würde ja interessieren, wieso Du diese Views erstellen willst? Was spricht gegen das dynamische Ermitteln mittels passender ``WHERE``-Bedingung? (Denn vermutlich musst Du diese ganzen Views ja später auch noch "managen", was zusätzlich Komplexität reinbringt)

Re: Automatisches Generieren von Views aus einer MySQL-Daten

Verfasst: Freitag 20. Februar 2015, 19:12
von pybus
Hallo, vielen Dank für eure Antworten.

@EyDu: Danke für den Hinweis. Mittels execute konnt ich auch Datenbanken und Tabellen anlegen, von daher ging ich davon aus das das bei Views auch geht. Gibt es dafür denn dann eine Alternative?

@Hyperion: Ich würde gerne für einen Anwender eine Schnittstelle schaffen, mit der er sich die gefilterten Werte in einzelnen Views rausholen kann, ohne sich mit den MySQL-Befehlen beschäftigen zu müssen. Wäre die Unterteilung in Views dafür ein so ungebräuchliches Vorgehen?

Viele Grüße

Re: Automatisches Generieren von Views aus einer MySQL-Daten

Verfasst: Freitag 20. Februar 2015, 20:21
von BlackJack
@pybus: Natürlich kannst Du auch Views damit anlegen. Du hast das Problem noch nicht verstanden: Man kann nur *Werte* vom Datenbankadapter in das SQL einfügen lassen. Ein Viewname ist aber kein Wert. Den müsstest Du da anders hinein bekommen. Was aber schon ein gutes Zeichen dafür ist, dass das was Du da machen willst nicht wirklich vorgesehen ist.

Ich verstehe das Problem immer noch nicht. Ob sich der Anwender nun einen Viewnamen auswählen muss oder einen Wert für die ``WHERE``-Bedingung ist doch für den Anwender egal, man kann ihm in beiden Fällen die gleiche Schnittstelle anbieten. Für Dich als Programmierer und für das DBMS ist es dagegen aber nicht egal wenn Du da versuchst etwas reinzubiegen was so nicht gemacht werden sollte.

Re: Automatisches Generieren von Views aus einer MySQL-Daten

Verfasst: Freitag 20. Februar 2015, 20:50
von /me
pybus hat geschrieben:Wäre die Unterteilung in Views dafür ein so ungebräuchliches Vorgehen?
Ich arbeite seit über 25 Jahren mit relationalen Datenbanken und habe im professionellen Umfeld so ein Vorgehen noch nie gesehen. Entweder hast du soeben die eierlegende Wollmilchsau gefunden die das Ei des Kolumbus legt oder deine Idee ist nicht wirklich gut. Was hältst du für wahrscheinlicher?

Aus der Beschreibung die du bisher als Grund für dieses Vorgehen gegeben hast kann zumindest ich die Notwendigkeit dafür nicht erkennen.