sqlalchemy

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich versuche mir gerade eine Klasse zu erstellen, in der ich per SqlAlechemy Daten einfügen, abfragen kann usw. Jetzt stehe ich da vor einem Problem. Habe mir zwar einige Tuts angeschaut aber irgendwie werde ich da nicht schlau raus. Hier mein einfacher Code:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from sqlalchemy import create_engine
from sqlalchemy import MetaData, Column, Table, ForeignKey
from sqlalchemy import Integer, String
from sqlalchemy.sql import select

class dbtools ():
	def __init__ (self):
		#
		# Tabellen werden nur angelegt wenn diese noch nicht existieren.
		# 
		engine = create_engine('sqlite:///data/bons.sqlite', echo=True)
		metadata = MetaData(bind=engine)
		kaufhaus_table = Table('kaufhaus', metadata,
	
			Column('id', Integer, primary_key=True),
			Column('name', String (20))
			)	
		metadata.create_all ()
	
	def insertKaufhaus (self):
		print (kaufhaus_table)
		'''
		ins = kaufhaus_table.insert()
		new_kaufhaus = ins.values(name="Real")
		conn = engine.connect()
		conn.execute(new_kaufhaus)
		'''
if __name__ == "__main__":
	mydbtools = dbtools ()
	mydbtools.insertKaufhaus ()
	

Im __init__ wird meine Tablelle erstellt ( ist so weit auch richtig ). Nun möchte ich auch eine Methode haben, in der ich z.B. Daten einfügen kann. Allerdings sind ja in der Methode ( insertKaufhaus ), die Variablen kaufhaus_table wieder unbekannt. Wie lößt man das Problem am besten? Wollte jetzt ungern globale Variablen benutzen. Aber irgendwie muß ich ja auch an die Tablellen wieder ran, die ich angelegt hatte.
Zuletzt geändert von Anonymous am Mittwoch 7. August 2013, 11:31, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@The Hit-Man: Deine Klasse sollte nach den üblichen Konventionen `DBTools` heissen. Oder `DbTools`. Aber halt nicht komplett in Kleinbuchstaben. Dann brauchst Du auch diesen unnötigen `my`-Präfix nicht, wenn Du ein Exemplar von dem Objekt erstellst.

Das ist so aber sowieso keine Klasse. Nur syntaktisch. Denn das Objekt kapselt ja überhaupt keinen Zustande den die Methoden gemeinsam haben. Die beiden „Methoden” könnten ohne weiteres einfache Funktionen sein.

Die Tabellen-Exemplare würde ich auf Modulebene erstellen. Denn aus Sicht Deines Programms sind das ja Konstante Werte welche die Tabellen in der Datenbank beschreiben. Die `engine` sollte man dann natürlich nicht an die Metadaten binden, denn wenn man das auf Modulebene macht, legt man dort quasi „statisch” die Datenbank fest. Kann also nicht mehrere davon haben. Zum Beispiel eine Produktive, eine zu Testen/Spielen, und eine für automatisierte Tests.

Gibt es einen Grund warum Du auf dieser Ebene arbeitest und nicht das ORM von SQLAlchemy verwendest?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

naja, ich habe einfach nach einem Beispiel gearbeitet ... Weil ich gerade damit erst anfange.

http://www.blog.pythonlibrary.org/2010/ ... rt-1-of-2/


An sonsten habe ich kein gutes Tut gefunden :( und wollte mit sqlalchemy ein wenig unabhängig sein, den Datenbanken gegenüber. Ich versuche mich da gerade bischen reinzudenken. Vorher hatte ich nur ganz normalen SQL-Syntax benutzt.
BlackJack

@The Hit-Man: Das Tutorial verwendet ja noch Python 2.5 und SQLAlchemy 0.6. Was fehlt Dir denn in der offiziellen SQLAlchemy-Dokumentation? Da gibt es doch auch Tutorials und Beispiele.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

naja, sieht alles sehr sehr mächtig aus ... muß mich da irgendwie erst mal rein denken ...
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

irgendwie raffe ich das total nicht :( also die Beispiele auf der Seite ... grrrrrr

http://docs.sqlalchemy.org/en/rel_0_8/orm/tutorial.html
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

The Hit-Man hat geschrieben:irgendwie raffe ich das total nicht :( also die Beispiele auf der Seite ... grrrrrr

http://docs.sqlalchemy.org/en/rel_0_8/orm/tutorial.html
Woran genau mangelt es Dir denn beim Verständnis? Du schreibst das jetzt so allgemein, dass es uns unklar ist, *was* genau Du an dem Tutorial nicht verstehst...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ach bekomme immer die Kriese wenn es beim ersten Mal nicht klappt ... Muß mir eben bischen Zeit nehmen. Erste Erfolge hatte ich schon. Jetzt verstehe ich erst mal das man die Tabellen im Code definieren muß auch wenn meine ja schon fertig sind. Sonst hat das ja alles keinen Sinn ;)
Datensätze anlegen funktioniert schon mal ... Mir graut es schon davor, "joins" zu basteln ...

Für jede einzelne Tablelle muß also eine Beschreibung im Code interlegt sein.
BlackJack

@The Hit-Man: Die Tabellen im Code definieren müsstest Du eine Ebene tiefer doch auch. Dort mit `Table()`-Exemplaren.

Joins musst Du beim ORM ja nicht mehr unbedingt selber basteln, zumindest nicht wenn es Fremdschlüsselbeziehungen sind, die Du einmal bei den Modell-Klassen als `relation()` definierst. Das wird erst wieder interessant wenn es um Effizienz geht, oder „ungewöhnliche” Sachen abgefragt werden sollen.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Eigentlich bin ich ja nur reines SQL gewöhnt. Wie ist das eigentlich? Kann ich unter sqlalechemy auch normale SQL-Abfragen machen? Und wenn, wie würde das gehen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

The Hit-Man hat geschrieben:Eigentlich bin ich ja nur reines SQL gewöhnt. Wie ist das eigentlich? Kann ich unter sqlalechemy auch normale SQL-Abfragen machen? Und wenn, wie würde das gehen?
Vielleicht solltest du einfach das von dir verlinkte Tutorial durcharbeiten ;-)
Das Leben ist wie ein Tennisball.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Bin ich bei ;)
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Jetzt stehe ich wieder vor einem Problem. Als Gui wollte ich wxpython nehmen. Nur das gibt es noch nicht für Python3. Was kann man denn jetzt da machen? Python3 brauche ich doch für die neue sqlalchemy?
BlackJack

@The Hit-Man: Wie kommst Du darauf das man Python 3 braucht? Selbst bei der 8.x Beta steht das man Python 2.5+ verwenden kann.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

War ich einfach von ausgegangen. Habe mir dann jetzt python2 installiert ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wobei Du unabhängig von dieser Frage die Wahl von wx in Frage stellen solltest. Das Toolkit bietet nichts, was irgend wie besonders (gut) wäre. Simpel und dabei wäre tk, umfassend und FullStack wären Qt und Gtk.

Es spricht imho nichts für wx, es sei denn, Du beherrschst wx eben schon... ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Für `wx` sprechen unter Windows die Lizenz und die relativ leichte Installierbarkeit. An der Lizenz kann es bei PyQt haken, und Gtk soll ein bisschen umständlich zu installieren sein.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Also, ich hatte mir das wx angeeignet. Klar gibts hier und da mal nen paar Schwierigkeiten, wo ich lesen muß.
Antworten