Automatisches Generieren von Views aus einer MySQL-Datenbank

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
pybus
User
Beiträge: 6
Registriert: Montag 8. September 2014, 16:32

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! ;)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

"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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
pybus
User
Beiträge: 6
Registriert: Montag 8. September 2014, 16:32

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
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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Antworten