2016-07-11 23 views
0

Ich bin neu in Pyramid. Ich habe Python für ein paar Monate benutzt. Ich habe eine Python-Anwendung unter Linux erstellt, um eine Oracle-Datenbank mit wöchentlichen Datenfeeds eines Herstellers zu verwalten. Um das zu erreichen, musste ich unter Verwendung des Pakets cx_Oracle eine angepasste Wrapper-Klasse für die Datenbank erstellen. Ich hatte spezielle Anforderungen für die Pflege der Historie in der Datenbank. Der gesamte Oracle-Zugriff durchläuft die Methoden in diesem Wrapper. Ich möchte jetzt mit Pyramid eine einfache Reporting-Browser-Schnittstelle zur Oracle DB erstellen. Um mir die größtmögliche Flexibilität zu ermöglichen, möchte ich den Wrapper verwenden, den ich bereits für die Daten auf Oracle anstelle von Alchemy (oder möglicherweise damit, ich bin mir nicht sicher). In meiner Pyramid-App habe ich überlegt, meinen Wrapper in meine views.py init Methode zu importieren, aber das scheint mit jedem Browser ausgeführt zu werden.Hinweise zum Zugriff auf Datenbankzugriff in einer benutzerdefinierten Umgebung mit Python-Pyramide

Kann jemand vorschlagen, wie ich eine dauerhafte Verbindung zu Oracle erstellen könnte, die ich immer wieder von meiner Berichtsanwendung verwenden kann, die meine Wrapper-Klasse verwendet? Ich finde Pyramid ein bisschen undurchsichtig. Ich bin mir nie sicher, was hinter den Kulissen passiert, aber ich bin bereit, auf Vertrauen zu vertrauen, bis ich den Schwung davon bekomme. Ich brauche den Vorteil der automatischen Autorisierung/Authentifizierung und Anmeldung. Was ich wirklich suche, ist ein guter Ansatz von erfahrenen Pyramid-Benutzern, bevor sie den falschen Weg gehen. Vielen Dank.

Antwort

0

Sie sollten definitiv SQLAlchemy verwenden, wie es Verbindungspooling und dergleichen verwendet. In Ihrem Fall würde SQLAlchemy cx_Oracle darunter verwenden, aber Sie können sich darauf konzentrieren, den tatsächlichen Code zu schreiben, anstatt Verbindungen zu verwalten/zu bündeln/und so weiter.

Sie sollten den Mustern in Wiki2 tutorial folgen, um grundlegende SQLAlchemy einzurichten.

0

Also, im Grunde läuft die Frage auf "wie verwende ich meine bestehende API mit Pyramid", richtig? Das ist ganz einfach, wie Pyramid Datenbank-agnostisch und sehr transparent in diesem Bereich ist trotz allem, was Sie sagen :) Grundsätzlich Sie es importieren, seine Methoden aufrufen, Daten abrufen und es auf die Vorlage senden:

import pokemon_api as api 

@view_config(route_name='list_pokemon', renderer='pokemon_list.mako') 
def list_pokemon(request): 
    # To illustrate how to get data from the request to send to your API 
    batch_start = request.GET.get('batch_start', 0) 
    batch_end = batch_start + request.GET.get('batch_size', 0) 
    sort_order = request.GET.get('sort_by', 'name') 

    # Here we call our API - we don't actually care where it gets the data from, it's a black box 
    pokemon = api.retrieve_pokemon(from=batch_start, to=batch_end, sort=sort_order) 

    # send the data to the renderer/template 
    return { 
     'pokemon': pokemon 
    } 

@view_config(route_name='add_pokemon', request_method='POST') 
def add_pokemon(request): 
    """ 
    Add a new Pokemon 
    """ 
    name = request.POST.get('name', 0) 
    weight = request.GET.get('weight', 0) 
    hight = request.GET.get('hight', 0) 

    api.create(name=name, weight=weight, height=height) 

    # go back to the listing 
    return HTTPFound('/pokemon_list') 

und wenn Ihre API eine Initialisierung benötigt, können Sie es beim Start

import pokemon_api as api 

def main(global_config, **settings): 
    """ This function returns a Pyramid WSGI application. 
    """ 
    config = Configurator(settings=settings) 
    ... 

    api.init("MAGIC_CONNECTION_STRING") 
    return config.make_wsgi_app() 

natürlich tun können, dies setzt voraus, Ihre API bereits Transaktionen, Verbindungen abgewickelt werden, Pooling und andere langweilige :)

Ein letzter Punkt zu erwähnen - In Python importieren Sie normalerweise keine Dinge Innerhalb von Methoden importieren Sie sie am Anfang der Datei auf Modulebene-Bereich. Es gibt Ausnahmen für diese Regel, aber ich sehe nicht, warum Sie das in diesem Fall benötigen würden. Außerdem sollte das Importieren eines Moduls frei sein von Nebenwirkungen (die Sie vielleicht haben, seit "das Importieren meines Wrappers in meine views.py __init__ Methode" Probleme verursacht).

+0

Dank Sergey. Unten ist der tatsächliche Code in der RD-Wrapper-Klasse. Ich habe als Übung geschrieben, um etwas Python zu lernen, so dass Sie viele Revisionen darin sehen werden. – Niall

+0

Entschuldigung, hier ist die Datei: - https://www.dropbox.com/s/b7848m1r49sk4z8/beneOracleWrapper.py?dl=0 – Niall

+0

Ich nehme an, Ihre Lösung ist noch gültig? – Niall