webentwicklung-frage-antwort-db.com.de

sqlalchemy.orm.exc.UnmappedInstanceError in Kolben

Ich habe die SQLAlchemy-Dokumente gelesen, aber ich verstehe sie nicht. Der Fehler (UnmappedInstanceError) besagt, dass etwas nicht zugeordnet ist. Was ist nicht zugeordnet? Ich bekomme wirklich keine sqlalchemy und möchte wieder nackte sqlite benutzen, aber so viele Leute empfehlen das, deshalb dachte ich, ich sollte es lernen. Hier ist der Traceback:

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)

File "C:\Users\Me\repos\mandj2\app\views.py", line 170, in add_manentry
db.session.add(q)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\sqlalchemy\orm\scoping.py", line 149, in do
return getattr(self.registry(), name)(*args, **kwargs)

File "C:\Users\Me\repos\mandj\venv\lib\site-packages\sqlalchemy\orm\session.py", line 1452, in add
raise exc.UnmappedInstanceError(instance)

UnmappedInstanceError: Class '__builtin__.unicode' is not mapped

Hier ist der anwendbare Code:

@app.route('/addm', methods=['POST'])
def add_mentry():
    if not session.get('logged_in'):
        abort(401)
    form = MForm(request.form)
    filename = ""
    if request.method == 'POST':
        cover = request.files['cover']
        if cover and allowed_file(cover.filename):
            filename = secure_filename(cover.filename)
            cover = cover.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

    q = request.form['name']
    # do for 12 more fields
    db.session.add(q)
    db.session.commit()
    flash('New entry was successfully posted')
    return redirect(url_for('moutput'))
14
user2986242
q = request.form['name']
# do for 12 more fields
db.session.add(q)

request.form['name'] gibt einen Unicode-Wert zurück. Dann machst du ...

db.session.add(q)

Das Ziel der Sitzung ist es, Entitäten (Python-Objekte) und nicht einzelne Unicode-Werte im Auge zu behalten, während Sie versuchen, dies zu tun (Siehe hier für weitere Informationen zur Sitzung). Sie sollten also Objekte hinzufügen, die über ein Mapping verfügen (z. B. ein User-Objekt, wie im Abschnitt "Mapping" des ORM-Tutorials gezeigt), aber Sie übergeben tatsächlich einen einfachen Unicode-Wert

Was Sie verwenden, ist nur ein Teil von SQLAlchemy: der ORM (Object-Relational Mapper). Der ORM versucht beispielsweise, ein neues Python-Objekt zu erstellen und die SQL automatisch generieren zu lassen, indem das Objekt der Sitzung "hinzugefügt" wird.

a = MyEntity()
session.add(a)
session.commit() # Generates SQL to do an insert for the table that MyEntity is for

Beachten Sie, dass Sie SQLAlchemy ohne die ORM-Funktionalität verwenden können. Sie könnten einfach db.execute('INSERT...', val1, val2) tun, um Ihre bereits "nackte" SQL zu ersetzen. SQLAlchemy stellt Ihnen Verbindungspooling usw. bereit (wenn Sie jedoch SQLite verwenden, ist das Verbindungspooling wahrscheinlich kein Thema).

Wenn Sie Flask-SQLAlchemy verstehen möchten, empfiehlt es sich zunächst, die Funktionsweise von SQLAlchemy (insbesondere die ORM-Seite) anhand von einfachen Skripts (wie in den Tutorials ) zu verstehen, und dann zu verstehen, wie Flask-SQLAlchemy funktioniert würde damit arbeiten.

6
Mark Hildreth

Wenn Sie der Sitzung ein Nichtmodellobjekt hinzufügen, erhalten Sie UnmappedInstanceError.

In Ihrem Fall war q wahrscheinlich ein Unicode-String und kein Modellobjekt. (Anscheinend verwenden Sie Python 2.x, weil in Python 3.x "str" ​​angezeigt wird). Dies war die Zeile der Hauptursache für UnmappedInstanceError: Class '__builtin__.unicode' is not mapped:

  File "C:\Users\Me\repos\mandj2\app\views.py", line 170, in add_manentry
  db.session.add(q)
8
Devy

Wenn Sie die Datenbank ändern, sehen Sie: Sie müssen sich an das Objekt in dem Objekt wenden, das Sie ändern möchten. Siehe unten:

client = session.query(Clients).filter_by(id=client_id).one()
if request.method == 'POST':
    new_name = request.form['form_name']
    client.name = new_name
    session.add(client)
    session.commit()

Wie Sie im 'Client'-Objekt sehen können, haben wir unter anderem Informationen zum Objekt. Wir möchten nur den Namen direkt ändern, daher müssen Sie ihn ansprechen. (Kundenname)


Wenn Sie der Datenbank eine neue Sache hinzufügen: Wenn Sie der Datenbank einen neuen Wert mit orm hinzufügen, müssen Sie in diesem Fall das Objekt in dem Objekt angeben, das die Daten empfängt. (Kundenname)

    if request.method == 'POST':
        new_name = request.form['form_name']
        name = Clients(name=new_name)
        session.add(name)
        session.commit()

Hoffentlich hilft das. 

0
Andy