[Django] Werte per Script in Django-DB eintragen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

[Django] Werte per Script in Django-DB eintragen

Beitragvon Mawilo » Mittwoch 11. Februar 2009, 14:45

Hallo,

ich möchte gerne die Pfade aller meiner Musikdateien in eine Datenbank eintragen. Mit Django soll dann eine Suche und Auswahl der Dateien möglich sein.
Das finden der Dateien ist ja kein Problem. Ich kann diese auch in die Django-Datenbank eintragen. Nur wenn ich jetzt in Django in der Admin-Oberfläche alles anzeigen lassen möchte, erhalte ich nur eine Fehlermeldung:

Code: Alles auswählen

Environment:

Request Method: GET
Request URL: http://127.0.0.1:8000/admin/db_content/lieddetails/
Django Version: 1.1 pre-alpha
Python Version: 2.6.0
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.admin',
 'medien.db_content']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware')


Template error:
In template /usr/lib64/python2.6/site-packages/django/contrib/admin/templates/admin/change_list.html, error at line 34
   Caught an exception while rendering: too many values to unpack
   24 : {% if cl.has_filters %}
   25 : <div id="changelist-filter">
   26 : <h2>{% trans 'Filter' %}</h2>
   27 : {% for spec in cl.filter_specs %}
   28 :    {% admin_list_filter cl spec %}
   29 : {% endfor %}
   30 : </div>
   31 : {% endif %}
   32 : {% endblock %}
   33 :
   34 : {% block result_list %} {% result_list cl %} {% endblock %}
   35 : {% block pagination %}{% pagination cl %}{% endblock %}
   36 : </div>
   37 : </div>
   38 : {% endblock %}
   39 :

Traceback:
File "/usr/lib64/python2.6/site-packages/django/core/handlers/base.py" in get_response
  86.                 response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib64/python2.6/site-packages/django/contrib/admin/options.py" in wrapper
  208.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/lib64/python2.6/site-packages/django/contrib/admin/sites.py" in inner
  148.             return view(request, *args, **kwargs)
File "/usr/lib64/python2.6/site-packages/django/contrib/admin/options.py" in changelist_view
  691.         ], context, context_instance=template.RequestContext(request))
File "/usr/lib64/python2.6/site-packages/django/shortcuts/__init__.py" in render_to_response
  18.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/usr/lib64/python2.6/site-packages/django/template/loader.py" in render_to_string
  107.     return t.render(context_instance)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  176.         return self.nodelist.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  768.                 bits.append(self.render_node(node, context))
File "/usr/lib64/python2.6/site-packages/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/loader_tags.py" in render
  97.         return compiled_parent.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  176.         return self.nodelist.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  768.                 bits.append(self.render_node(node, context))
File "/usr/lib64/python2.6/site-packages/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/loader_tags.py" in render
  97.         return compiled_parent.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  176.         return self.nodelist.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  768.                 bits.append(self.render_node(node, context))
File "/usr/lib64/python2.6/site-packages/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/loader_tags.py" in render
  24.         result = self.nodelist.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  768.                 bits.append(self.render_node(node, context))
File "/usr/lib64/python2.6/site-packages/django/template/debug.py" in render_node
  71.             result = node.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/loader_tags.py" in render
  24.         result = self.nodelist.render(context)
File "/usr/lib64/python2.6/site-packages/django/template/__init__.py" in render
  768.                 bits.append(self.render_node(node, context))
File "/usr/lib64/python2.6/site-packages/django/template/debug.py" in render_node
  81.             raise wrapped

Exception Type: TemplateSyntaxError at /admin/db_content/lieddetails/
Exception Value: Caught an exception while rendering: too many values to unpack

Was kann das für eine Ursache haben?

Ich habe im Model 6 Felder definiert:

Code: Alles auswählen

class LiedDetails(models.Model):
    titel = models.CharField(max_length=100)
    kuenstler = models.CharField(max_length=100)
    album = models.CharField(max_length=100)
    dateidatum = models.DateTimeField()
    dateipfad = models.CharField(max_length=400)
    kommentar = models.TextField('Kommentar')

In die Datenbank schreibe ich diese 6 Werte und zusätzlich als erstes den PRIMARY KEY.

Code: Alles auswählen

        sql = 'INSERT INTO db_content_lieddetails VALUES(NULL, ?, ?, ?, ?, ?, ?)'
        self.cursor.execute(sql, tup)
        self.conn.commit()

Grüße
Mawilo
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 11. Februar 2009, 16:55

Du fügst deine Werte über eine selbst gebaute SQL in die Datenbank ein??? Das macht keinen Sinn. Warum machst du es nicht über das ORM?

Ich vermute mal, das deine Daten in der Datenbank nicht zum Modell passen.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Mittwoch 11. Februar 2009, 18:09

jens hat geschrieben:Du fügst deine Werte über eine selbst gebaute SQL in die Datenbank ein??? Das macht keinen Sinn. Warum machst du es nicht über das ORM?


... und was ist ORM? :oops:
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 11. Februar 2009, 18:21

Mawilo hat geschrieben:... und was ist ORM? :oops:

Gegenfrage: "was ist Wikipedia" oder auch: "was ist eine Suchfunktion". Gerade im Datenbank-Forum werden quasi in jedem zweiten Thread ORMs genannt, ebenso in der Django-Doku.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Mittwoch 11. Februar 2009, 20:09

@Mawilo: Am besten du ackerst mal das django Tutorial durch und schaust dir an wie dort in der Beispiel-App alles gemacht wirst. Das Wissen wendest du auf dein Projekt an.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 12. Februar 2009, 09:45

Leonidas hat geschrieben:Gegenfrage: "was ist Wikipedia" oder auch: "was ist eine Suchfunktion". Gerade im Datenbank-Forum werden quasi in jedem zweiten Thread ORMs genannt, ebenso in der Django-Doku.


Ach waren das noch schöne Zeiten, als hier auch einem nicht-Informatiker und Hobby-Pythonanwender geholfen wurde... :cry:

Aber natürlich hätte ich auch im Wiki den Artikel zu Object-Relational Mapping und Object Role Modeling durchlesen können. Nur habe ich dann immer noch keine Ahnung, wie ich meine ca. 10.000 Datensätze in die Datenbank bekomme, ohne ein eigenes Script. Wie gesagt - ich habe nie Informatik studiert (abgesehen davon, dass in meiner Schulzeit nur ein Rechenschieber zur Verfügung stand :D )

jens hat geschrieben:Am besten du ackerst mal das django Tutorial durch und schaust dir an wie dort in der Beispiel-App alles gemacht wirst. Das Wissen wendest du auf dein Projekt an.

Ich habe auch schon verschiedene Applikationen nach Tutorials erstellt. Da liegt aber die Herausforderung da drin, nach den sehr fehlerhaften Anleitungen überhaupt etwas funktionierendes hinzubekommen. Und der obligatorische Blog als Beispiel hilft mir hier wenig weiter.


Grüße
Mawilo
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 12. Februar 2009, 10:05

Mawilo hat geschrieben:Ach waren das noch schöne Zeiten, als hier auch einem nicht-Informatiker und Hobby-Pythonanwender geholfen wurde... :cry:

Das stimmt so nicht. Es wird heute immer noch nicht-Informatikern und Hobby-Anwendern geholfen, nur muss jeder eben damit rechnen, Dokumentation lesen zu müssen. Und eine Frage wie was ist ein ORM kann man sich doch wirklich selbst beantworten, nicht? Gerade wenn man Django nutzt, wo das ORM die wichtigste Komponente des ganzen Frameworks ist, die Django von anderen Lösungen abhebt.

Mawilo hat geschrieben:Aber natürlich hätte ich auch im Wiki den Artikel zu Object-Relational Mapping und Object Role Modeling durchlesen können. Nur habe ich dann immer noch keine Ahnung, wie ich meine ca. 10.000 Datensätze in die Datenbank bekomme, ohne ein eigenes Script.

Deswegen habe ich auch die Django-Dokumentation angesprochen die erklärt wie man das ORM nutzt. Ich habe auch einige Importerskripte die Daten aus CSV-Dateien mittels Django-ORM in die Datenbank schreiben so dass ich sie in meiner Webapplikation (ebenfalls über das Django-ORM) wieder auslesen kann. Im großen und ganzen ist das auch kein Problem.

Mawilo hat geschrieben:Wie gesagt - ich habe nie Informatik studiert (abgesehen davon, dass in meiner Schulzeit nur ein Rechenschieber zur Verfügung stand :D )

Und? Ich habe ORMs auch verwendet bevor ich Informatik studiert habe. Im Studium wird dir tendenziell eher wenig praktisches beigebracht, mehr Theorie nach dem Schema "wie modelliere ich Datenbanken" oder "wie funktioniert eine Datenbankabfrage", "welche Komplexitätsklasse hat welcher Befehl und warum". Darum muss man sich jedoch in den seltensten Fällen kümmern und um ein ORM zu verwenden muss man nicht Informatik studiert haben, es reicht lediglich die Dokumentation zu lesen und besonders im Fall von Django ist es so, dass die Dokumentation und das ORM selbst recht einfach zu benutzen sind.

Mawilo hat geschrieben:Da liegt aber die Herausforderung da drin, nach den sehr fehlerhaften Anleitungen überhaupt etwas funktionierendes hinzubekommen. Und der obligatorische Blog als Beispiel hilft mir hier wenig weiter.

Wo ist die aktuelle Django-Dokumentation fehlerhaft? Aber ich mail' dir gleich ein Beispiel.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 12. Februar 2009, 11:14

Hallo Leonidas,

danke für das Beispiel. Ich glaube, ich habe so etwas wie django.db.transaction gesucht. Ich werde am Wochenende mal damit versuchen, die Datenbankzugriffe zu realisieren.

Danke
Mawilo
Benutzeravatar
Hyperion
Moderator
Beiträge: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Donnerstag 12. Februar 2009, 11:34

Da ich noch nichts mit Django gemacht habe, wollte ich mal versuchen meine Ideen dazu zu posten:

Eigentlich müßte man doch nur das in Django modellierte ORM-Modell instanziieren, in die einzelnen Objekte die Daten einfügen (aus CSV oder wo auch immer her) und das ganze dann in die DB per ORM-Methode zurückschreiben?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 12. Februar 2009, 13:00

Hyperion hat geschrieben:Eigentlich müßte man doch nur das in Django modellierte ORM-Modell instanziieren, in die einzelnen Objekte die Daten einfügen (aus CSV oder wo auch immer her) und das ganze dann in die DB per ORM-Methode zurückschreiben?

Genau so mache ich es auch. Einzige Schwierigkeit dabei: man muss eine Umgebungsvariable setzen, was sich ziemlich hässlich anfühlt, damit das Django-ORM seine Datenbank-Konfiguration findet.

Mawilo, die Transaction habe ich nur deswegen, damit bei einem Fehler ein Rollback ausgeführt wird. Ich wollte sichergehen, dass bei Fehlern im Import (passiert öfters mal) kein Schrott in der Datenbank steht und bevorzuge also das Verwerfen der Änderungen bei Fehlern.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Beitragvon apollo13 » Donnerstag 12. Februar 2009, 22:12

Leonidas hat geschrieben:
Hyperion hat geschrieben:Eigentlich müßte man doch nur das in Django modellierte ORM-Modell instanziieren, in die einzelnen Objekte die Daten einfügen (aus CSV oder wo auch immer her) und das ganze dann in die DB per ORM-Methode zurückschreiben?

Genau so mache ich es auch. Einzige Schwierigkeit dabei: man muss eine Umgebungsvariable setzen, was sich ziemlich hässlich anfühlt, damit das Django-ORM seine Datenbank-Konfiguration findet.

Nein, musst du nicht. Gerade für solche Skripte finde ich settings.configure wirklich nett. (http://docs.djangoproject.com/en/dev/to ... ngs-module)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 13. Februar 2009, 01:31

Tatsache. Ist das neu oder habe ich es all die Zeit einfach übersehen und die ganzen Blogpost-Autoren die ebenfalls darüber gemeckert haben?

Feine Sache, werde ich demnächst mal anpassen. Das macht die ganze Sache viel praktischer.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 13. Februar 2009, 16:28

Habe es versucht und siehe da, es funktioniert nicht wie gewünscht.

Die Idee ist dass ich zwei Module habe, einmal ``settings`` und einmal ``develsettings``. Das Problem ist nun dass wenn ich ein Modul angebe folgendes zutrifft:

Django Docs hat geschrieben:Be aware that if you do pass in a new default module, it entirely replaces the Django defaults, so you must specify a value for every possible setting that might be used in that code you are importing

Somit müsste ich auch sowas wie ``DATABASE_OPTIONS`` angeben was mich aber eigentlich überhaupt nicht interessiert und was ich nirgendwo konfiguriert habe weil mit die Django-Defaults reichen.

Ergo: so in der Form kaum brauchbar. Zudem ein Zugriff auf ``django.conf.settings.global_settings`` nicht möglich ist, weil keine Einstellungen geladen sind (WTF?), somit könnte man nicht über irgendwelche Tricks die Defaults wieder eintragen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Beitragvon apollo13 » Freitag 13. Februar 2009, 17:51

Ich dachte bei einem Skript wie diesem eher an sowas:

Code: Alles auswählen

from django.conf import settings

settings.configure(
  DATABASE_HOST='localhost',
  DATABASE_NAME='bla'
)

Ich sehe keinen Grund bei so kleinen Scripten alles zu überschreiben...
Sollte aber auch irgendwie gehen ;)

Und ja settings.configure gibt es schon ewig.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder