Datenbank als Modul einbinden?

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Hi, ich hab hier mal ne etwas seltsame Frage.

Folgendes Problem:
Ich hab ein Python Programm geschrieben das mit einer SQlite Datenbank arbeitet. Jetzt wollte ich dieses Programm auch auf einer NC Steuerung nutzen. Leider ist in dem System (Debian) kein SQlite installiert und ich bekomme nur ein

Code: Alles auswählen

No module named _sqlite3
Der Hersteller ist nicht bereit SQlite oder ein anderes Datenbanksystem nachzuinstallieren. (Und gibt natürlich auch das root Passwort nicht raus)

Deswegen meine Frage:
Ist es irgendwie möglich ein Datenbanksystem wie ein selbst geschriebenes Modul einzubinden? Also in das Verzeichniss mit meinem Programm hineinzukopieren und dann

Code: Alles auswählen

import datenbanksystem
????

Geht sowas? Gibts da was?

Gruß Tom
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Die erste Fehlermeldung ist die Antwort auf den Import:

Code: Alles auswählen

import sqlite3
? Wenn ja wurde Python ohne Sqlite-Support gebaut, `python*-minimal` waere das zum Beispiel.
Zur anderen Frage: Eventuell gibt es auch noch pure Python Implementierungen von Sqlite3, da sollte dir Google helfen. Evtl ist auch `shelve` eine Alternative. Das waere zwar auch nicht in `python*-minimal` ist aber pure Python, kann man also in den Pfad legen.
deets

Es gibt keine pur-Python-Implementierung von SQLite, da SQLite eine C-Bibliothek ist.

Mir waere auch keine andere DB-Engine bekannt, SQLite ist eigentlich immer das, was man nimmt, wenn man eine "eingebaute" haben will, statt eines dedizierten Servers.

Und damit zum OP: du kannst das Python-Modul auch selbst installieren, *wenn* du einen Compiler zur Verfuegung hast... ich vermute mal, dass nicht - aber die Hoffnung stirbt ja bekanntlich zuletzt.

Ansonsten shelve oder pickle oder berkley-db, wenn die vorhanden sind.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

deets hat geschrieben: Mir waere auch keine andere DB-Engine bekannt, SQLite ist eigentlich immer das, was man nimmt, wenn man eine "eingebaute" haben will, statt eines dedizierten Servers.
Der Audioplayer Amarok nutzt bspw. MySQL Embedded. Hatte ich davor auch noch nicht gehört. Ok, nicht exakt dasselbe wie SQLite, aber zumindest ähnlich.

@Topic: Kann man denn auf Netzwerkebene irgend wie kommunizieren? Evtl. ergäbe sich da ja eine Möglichkeit, Daten von außerhalb zu beziehen und die DB-Zugriffe dann per XMLRPC o.ä. zu kapseln.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Danke, ist aber nicht das was ich suche.

@deets
Wenn ich nen Compiler zur Verfügung hätte, wärs ja kein Problem.

shelve und pickle sind zwar ne gute Idee, aber ich suche ein DB-System das auch SQL versteht weil ich sehr viele Zugriffe mit verschiedensten Sortierungen und Tabellen hab.
(in dieser Art: SELECT **,**,** FROM *** WHERE *** < *** AND *** = '***' ORDER BY *** desc)
Die Berkeley-DB kann ich gerade nicht testen weil der Oracle-Server meine Registrierung nicht annimmt, und ob und wie ich das MySQL Embedded nutzen kann erschliesst sich mir auch nicht. Abgesehen davon dürft MySQL ein zu großer Brocken für die NC Steuerung sein weil die nur mit einem 800MHz Prozessor und einem recht knappen Speicher ausgerüstet ist, und einige Realtime Prozesse ausführt. (laut Hersteller)

Gibts sonst nix?
Kann ich evtl. SQLite irgendwie in ein unterverzeichniss kopieren und aus der Bash als user starten und dann aus Python raus ansprechen?

Gruß Tom
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wellnestom hat geschrieben:Danke, ist aber nicht das was ich suche.
Nur damit es klar wird: Du meinst die Kommunikation mit einer DB übers Netzwerk?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Äh, nein!
Ich möchte nicht übers Netzwerk mit einer Datenbank kommunizieren. Das wäre in dem aktuellen Situation zwar möglich, soll aber auch in Konfigurationen ohne Netzwerk funktionieren.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wellnestom hat geschrieben:Äh, nein!
Du solltest an Deiner Sprachlogik arbeiten... die richtige Antwort wäre "Äh, Ja!" gewesen ;-) Manchmal hilft einem da das Quoting, alleine weil man den Satz, auf den man antworten will, direkt vor der Nase stehen hat.

Aber immerhin ist diese Alternative nun klar ausgeschlossen.

Hast Du mal gegoogelt, ob es so was wie einen SQL-Aufsatz zu pickle, shelve, json o.ä. gibt? Ich meine beinahe ich hätte mal auf reddit davon gelesen... *such*

Edit: Da habe ich mich wohl geirrt, oder dieses JS-Tool im Kopf gehabt. Sieht mir jetzt auf den ersten Blick nicht so "sophisticated" aus... evtl. kann man so einen Wrapper auf für Python umsetzen? Wenn Du vor allem selects kapseln willst, ohne Subqueries und joins sollte es wohl nicht so schwer sein.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Hyperion hat geschrieben:Du solltest an Deiner Sprachlogik arbeiten...
Stimmt! Wenn ichs mir genau durchlese... :wink:
Hatte schon als Kind das Problem mit dem feinen Unterschied zwischen Ja und Nein, True und False, 0 und 1 .... :lol:

Also ich bin jetzt (noch) nicht wirklich DAS Python Genie. Also mit mal 'schnell' was umsetzten tu ich mir schon schwer. Wenns nix gibt wird mir wohl nix anderes als shelve übrigbleiben.
Gibts eigentlich ne Funktion um sowas automatisch sortieren zu lassen?

Code: Alles auswählen

zeile['0']={'x':10,'z':-50,'r':90}
zeile['1']={'x':60,'z':-35,'r':45}
zeile['2']={'x':30,'z':-250,'r':10}
zeile['3']={'x':40,'z':-5,'r':180}
z.B. die x-Werte von groß nach klein? (also eine Alternative zu folgender SQL-Anweisung: 'SELECT x,z FROM zeile ORDER BY x desc')

Gruß Tom
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Das ist eigentlich ein Kinderspiel in Python:

Code: Alles auswählen

>>> import operator
>>> data = [
... {'x':10,'z':-50,'r':90},
... {'x':60,'z':-35,'r':45},
... {'x':30,'z':-250,'r':10},
... {'x':40,'z':-5,'r':180}]
>>> data.sort(key=operator.itemgetter('x'))
>>> data
[{'x': 10, 'r': 90, 'z': -50}, {'x': 30, 'r': 10, 'z': -250}, {'x': 40, 'r': 180, 'z': -5}, {'x': 60, 'r': 45, 'z': -35}]
>>> map(operator.itemgetter("x", "z"), data)
[(10, -50), (30, -250), (40, -5), (60, -35)]
Edit: Ich sehe gerade, du wolltest absteigend sortieren. Die kleine Anpassung überlasse ich dir als Übung.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

EyDu hat geschrieben:Edit: Ich sehe gerade, du wolltest absteigend sortieren. Die kleine Anpassung überlasse ich dir als Übung.
Du hast noch was übersehen: Es ging nicht um eine Liste von Dicts, sondern um ein Dict aus Dicts ;-)

(Über den Sinn bzw. Unsinn, diese über einem Index-Schlüssel zu verwalten kann man natürlich streiten; evtl. war das hier nur ein schlecht gewähltes Beispiel)

Ich habe da Probleme, eine Sequenz von Keys per itemgetter zu generieren und komme da nur so weit:

Code: Alles auswählen

In [71]: zeile.items()
Out[71]:
[('1', {'r': 45, 'x': 60, 'z': -35}),
 ('0', {'r': 90, 'x': 10, 'z': -50}),
 ('3', {'r': 180, 'x': 40, 'z': -5}),
 ('2', {'r': 10, 'x': 30, 'z': -250})]

In [72]: sorted(zeile.items(), key=lambda tuple: tuple[1]["r"])
Out[72]:
[('2', {'r': 10, 'x': 30, 'z': -250}),
 ('1', {'r': 45, 'x': 60, 'z': -35}),
 ('0', {'r': 90, 'x': 10, 'z': -50}),
 ('3', {'r': 180, 'x': 40, 'z': -5})]
Aber wie geht man hier vor, um mehrere Keys auszuwählen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@wellnestom: Kannst ja mal einen Blick auf Gadfly werfen: http://gadfly.sourceforge.net/
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ist Gadfly eigentlich aktuell bzw. gepflegt? Letzter Release ist von 2009. Allerdings gibt's das Projekt ja schon so lange, dass es auch seeeehr ausgereift sein könnte. ;-)

Gruß, noisefloor
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Danke schonmal!
Gadfly versucht beim setup auch auf die systempartition zu schreiben. Als user hab ich da natürlich keine Schreibrechte, und root iss nich.

Hab jetzt den ganzen Nachmittag rumgebastelt, aber so wirklich klappts noch nicht.
Ist (für mich) gar nicht so einfach mit shelve und Dict's was zusammenzubasteln das sich wie mehrere Tabellen mit c.a. 10 Spalten und bis zu 1000 Zeilen verhält. Und das sich noch schön sortieren lässt.

Gruß Tom
BlackJack

@wellnestom: Hast Du einfach nur das normale `setup.py` versucht oder Dich mit den möglichen Argumenten auseinander gesetzt? Man kann so etwas auch zum Beispiel im $HOME installieren.
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Habs mit

Code: Alles auswählen

python setup.py build_py
versucht. Das tut zwar was, aber ich hab nicht erkannt was mit das nutzen soll. :K
Wie installierst du Gadfly denn??

Gruß Tom
BlackJack

@wellnestom: Ich installiere Gadfly gar nicht. ;-) Ich meinte die Optionen, die das Verzeichnis beeinflussen wohin installiert wird. Man kann halt auch in sein $HOME-Verzeichnis installieren lassen. Beziehungsweise könntest Du auch mal im `site`-Modul die Werte für `ENABLE_USER_SITE`, `USER_SITE`, und `USER_BASE` anschauen. Auf jeden Fall solltest Du Installing Python Modules mal durchlesen.
wellnestom
User
Beiträge: 29
Registriert: Sonntag 13. Februar 2011, 20:29

Wär toll wenn das klappt, tuts aber irgendwie nicht.
Hab mich jetzt mal da durchgewurschtelt und gadfly in nem Ordner im home Verzeichniss. Wenn ich jetzt aber den Pfad mit sys.append dahin setzte und das ganze versuche, passiert folgendes:

Code: Alles auswählen

>>> import gadfly
gadfly/store.py:11: DeprecationWarning: the md5 module is deprecated; use hashlib instead
  import sys, os, md5, types, marshal
>>> import gadfly
>>> connection = gadfly.gadfly()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "gadfly/database.py", line 26, in __init__
    from gadfly import sql, bindings
  File "gadfly/bindings.py", line 64
    [create, view, name, namelist, as, selection] = l
                                    ^
SyntaxError: invalid syntax
Beim ersten import mosert er rum, und dann hats noch nen Syntax Fehler

Tom
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du wirst wohl die Variable ``as`` umbenennen müssen (``as_`` z.B.) denn in den 150 Jahren seitdem Gadfly geschrieben wurde ist es offenbar ein Keyword geworden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@wellnostom: Wenn du dich mit shelve beschäftigst bzw. mit Key-Values Stores im allgemeinen, ist es SEHR hilfreich, erstmal alles SQL-mäßige zu vergessen - sonst kommt man nicht weit. ;-)

Eine IMHO ganz gut Einführung gibt es bei Redis. Dort wird erklärt, wie man Datenstrukturen für ein KV-Store aufbaut. Du musst dann halt nur von Redis auf Shelve abstrahieren. :-)

Gruß, noisefloor
Antworten