ubuntuusers.de

python -> PostGreSQL Konnektor Progammier-Hilfe

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.04 (Jaunty Jackalope)
Antworten |

the_clapper

Anmeldungsdatum:
3. Juli 2009

Beiträge: 134

Hallo, ich benutze diesen "python zu PostGreSQL Konnektor" um mit einem python-Script eine PostGreSQL Datenbank zu steuern. Der Tipp kam von Lysander in diesem Thread.

Nachdem ich mich nun sowohl etwas in python als auch in die SQL-Syntax eingelesen und rumprobiert habe, habe ich angefangen das von Lysander gepostet Script zu erweitern. Jetzt stecke ich gerade fest.

db = postgresql.open("pq://test:test1@localhost/beispiel")

# Nächste laufende Nummer beschaffen
nummer = db.prepare("SELECT MAX(id) FROM metadaten")
	
id_nr = nummer.first()+1

# Neue Tabelle anlegen mit Namen namexxxxx, wobei xxxxx die id ist
neue_tabelle = db.prepare("CREATE TABLE name$1()")
neue_tabelle('id_nr')

Ich würde gerne viele Datensätze auf einmal einlesen und jeweils in einer neuen Tabelle speichern. Der Name der Tabelle soll sich aus einem Wort und einer Zahlenfolge zusammensetzen. Die beiden letzten Zeilen sind noch nicht korrekt. Beim Anlegen der neuen Tabelle scheitere ich.

Der Code für einen "fest verdrahteten" Namen klappt anstandslos.

neue_tabelle = db.prepare("CREATE TABLE name12345()")
neue_tabelle()

Für Hilfe bin ich sehr dankbar.

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

@the clapper: Parameter für SQL-Ausdrücke können nicht an beliebigen Stellen eingesetzt werden, sondern nur anstelle einzelner Werte. Der Name der Tabelle ist nun eben kein Wert. Zum Erzeugen beliebiger Tabellennamen musst Du auf möglicherweise riskante Zeichenkettenformatierung zurückgreifen.

Pauschal würde ich allerdings behaupten, dass der eigentliche Fehler darin liegt, dass Du offenbar dynamische Tabellennamen erzeugen willst. Das ist kein Zeichen guten Entwurfs. Tabellen stehen für eindeutige, fixe Relationen, und nicht für beliebige Daten. Wenn Du in die Verlegenheit kommst, dynamische Tabellen erstellen zu müssen, dann überarbeite den Datenbankentwurf so, dass das nicht mehr nötig ist.

the_clapper

(Themenstarter)

Anmeldungsdatum:
3. Juli 2009

Beiträge: 134

Lunar schrieb:

@the clapper: Parameter für SQL-Ausdrücke können nicht an beliebigen Stellen eingesetzt werden, sondern nur anstelle einzelner Werte. Der Name der Tabelle ist nun eben kein Wert. Zum Erzeugen beliebiger Tabellennamen musst Du auf möglicherweise riskante Zeichenkettenformatierung zurückgreifen.

Danke für das Feedback und die Denkanstöße. Beim Einsetzen des Namens habe ich mich an diesem Beispiel orientiert und probiert es irgendwie hin zu biegen. Wenn das mit dem Tabellennamen eben keine gute Idee ist, dann muss ich mir etwas anderes überlegen. Hier warum ich den Namen so erzeugen möchte.

Der Name der Tabelle folgt einem festen Schema und zwar soll pro Messdaten-Satz eine Tabelle erzeugt werden. Diese sollte den Namen des Ortes, wo die Daten aufgenommen wurden z.B. Berlin und eben die Nummer enthalten. berlin12 wäre der zwölfte Messdatensatz der Kampagne Berlin.

Lunar schrieb:

Pauschal würde ich allerdings behaupten, dass der eigentliche Fehler darin liegt, dass Du offenbar dynamische Tabellennamen erzeugen willst. Das ist kein Zeichen guten Entwurfs. Tabellen stehen für eindeutige, fixe Relationen, und nicht für beliebige Daten. Wenn Du in die Verlegenheit kommst, dynamische Tabellen erstellen zu müssen, dann überarbeite den Datenbankentwurf so, dass das nicht mehr nötig ist.

Das mit den "dynamischen Namen" verstehe ich nicht so ganz. Der Name soll sich, nachdem ich die Tabelle angelegt habe nicht mehr ändert. Nur beim anlegen soll es "hochzählen", damit ich nicht hunderte Male das selbe Script starten muss nur mit verändertem Namen für die Tabelle.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

the clapper schrieb:

Der Name der Tabelle folgt einem festen Schema und zwar soll pro Messdaten-Satz eine Tabelle erzeugt werden. Diese sollte den Namen des Ortes, wo die Daten aufgenommen wurden z.B. Berlin und eben die Nummer enthalten. berlin12 wäre der zwölfte Messdatensatz der Kampagne Berlin.

Wieso müssen die Daten in eine Tabelle? Imho will man wohl Datensätzen (also den Tupeln in dieser Tabelle) eine Art Bezug zum Messort zuweisen. Genau das entspricht aber einer Relation. Also müßtest Du wohl eher diese abbilden, anstatt für jede Messreihe ein strukturell identische Tabelle anzulegen.

the_clapper

(Themenstarter)

Anmeldungsdatum:
3. Juli 2009

Beiträge: 134

Ähm, vielleicht meine Schuld wegen des Ausdrucks.

Die Messdaten sollen in eine Spalte in je einer Tabelle. Die Spalte wird vom Typ Geometry und POINT3Ds enthalten, das ist eine PostGis Datenstruktur.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

the clapper schrieb:

Die Messdaten sollen in eine Spalte in je einer Tabelle.

Wozu?

the_clapper

(Themenstarter)

Anmeldungsdatum:
3. Juli 2009

Beiträge: 134

Weil pro Tabelle nur ein GeometryColumn zugelassen ist und ich nicht alle in eine Tabelle packen wollte. Ich würde Speicherplatz sparen, weil in einer großen Tabelle noch zu jedem Punkt ein Datum, NameDesMessfiles, usw. gespeichert werden müßten. Mit ganz vielen Tabellen hätte die Verwaltungstabelle diese Einträge nur einmal nämlich pro Datensatz-Tabelle.

Oder denke ich da einfach falsch mit dem Argument Speicherplatz sparen und es sollte am besten in einer Mega-Tabelle? Es sind mehrere hundert Messdaten-Sätze und jeder hat ca. 10mio Punkte. Punkte werden auch doppelt vorkommen, die dann bereinigt werden müssen anschließend.

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

the clapper schrieb:

Weil pro Tabelle nur ein GeometryColumn zugelassen ist

Durch welche "Instanz"?

Du solltest Dir einmal genau überlegen, welche Daten Du in der DB ablegen willst, was mit diesen später passieren soll (welche Informationen sollen aus Queries gewonnen werden) und wie diese ggf. in Beziehung zueinander stehen. Ich würde Dir da zu einem ER-Diagramm raten, welches Du dann recht einfach in ein relationales Schema überführen kannst.

Im Moment macht es mir den Eindruck, als missbrauchst Du eine DB als Flatfile...

the_clapper

(Themenstarter)

Anmeldungsdatum:
3. Juli 2009

Beiträge: 134

Lysander schrieb:

the clapper schrieb:

Weil pro Tabelle nur ein GeometryColumn zugelassen ist

Durch welche "Instanz"?

Die PostGis Erweiterung lässt pro Tabelle nur eine Spalte vom Typ Geometry zu. Wieso ist mir leider auch nicht klar.

So, jetzt habt ihr mich total verwirrt und ich höre erstmal auf und gehe meinen Kopf durchlüften. Dabei hatte ich mir das so schön zu Recht gelegt...

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

the clapper schrieb:

Lysander schrieb:

the clapper schrieb:

Weil pro Tabelle nur ein GeometryColumn zugelassen ist

Durch welche "Instanz"?

Die PostGis Erweiterung lässt pro Tabelle nur eine Spalte vom Typ Geometry zu. Wieso ist mir leider auch nicht klar.

Ahso. Aber Du benötigst ja auch nur eine! Es macht keinen Sinn für jede Messung eine neue Spalte anzulegen und dann (extern per Konvention oder noch schlimmer durch Benennung einer Spalte) die Tabelle Schritt für Schritt zu erweitern. Das ist letztlich mindestens genauso mies wie das Erstellen neuer Tabellen für semantisch gleiche Werte!

Du solltest Meine Fragen mal versuchen - zunächst für Dich - zu beantworten und danach das Modell für die DB zu erstellen. Wenn Du Dich damit nicht auskennst (was ich irgend wie vermute), dann beschreibe hier eben mittels Worten und ggf. anderen Hilfsmitteln, welche Infos in die DB rein sollen bzw. daraus herauslesbar sein sollen.

Antworten |