Comment puis-je sélectionner une seule colonne à l'aide de SQLAlchemy?
Je veux choisir (et de retour) d'un champ de ma base de données avec une "clause where". Le code est:
from sqlalchemy.orm import load_only
@application.route("/user", methods=['GET', 'POST'])
def user():
user_id = session.query(User, User.validation==request.cookies.get("validation")).options(load_only("id"))
session.commit()
return user_id
Cela échoue et le traceback est:
File "/Library/Python/2.7/site-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Library/Python/2.7/site-packages/flask/app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Library/Python/2.7/site-packages/flask/app.py", line 1478, in full_dispatch_request
response = self.make_response(rv)
File "/Library/Python/2.7/site-packages/flask/app.py", line 1577, in make_response
rv = self.response_class.force_type(rv, request.environ)
File "/Library/Python/2.7/site-packages/werkzeug/wrappers.py", line 841, in force_type
response = BaseResponse(*_run_wsgi_app(response, environ))
File "/Library/Python/2.7/site-packages/werkzeug/wrappers.py", line 57, in _run_wsgi_app
return _run_wsgi_app(*args)
File "/Library/Python/2.7/site-packages/werkzeug/test.py", line 867, in run_wsgi_app
app_rv = app(environ, start_response)
TypeError: 'Query' object is not callable
Comment puis-je sélectionner et revenir juste le "id" de la colonne? J'ai essayé plusieurs autres façons aussi, mais aussi à l'échec. Est "load_only" la bonne option?
OriginalL'auteur user1903663 | 2016-05-10
Vous devez vous connecter pour publier un commentaire.
Un
Requête
objet accepte les entités de la requête que les arguments de position, de sorte qu'à faire passerUser.id
:scalaire()
renvoie le premier élément de la première suite ou rien, si aucune ligne n'a été trouvé. Il soulève MultipleResultsFound exception pour plusieurs lignes.load_only()
indique que seule la donnée de la colonne basée sur les attributs d'une entité doivent être chargés et tous les autres, attendent de l'identité, sera reporté. Si vous avez besoin de l'ensemble de laUser
modèle objet plus tard, cela peut être le chemin à parcourir. Dans ce cas, votre requête d'origine a changer:()
retourne exactement un résultat ou lève une exception (0 ou plus de 1 résultat). Si vous acceptezNone
comme valide de valeur de retour pour "aucun utilisateur trouvé", l'utilisationone_or_none()
.Noter que les prédicats, les critères de la clause where, ne doit pas être transmis à la
Query
objet en tant qu'entités, mais il a ajouté avecfilter()
.Pour couronner le tout, des vues en Flacon de s'attendre à ce que de vous renvoyer à l'un de:
(response, status, headers)
tupleLes machines permettra de traiter d'autre chose qu'un objet de réponse, une chaîne ou un tuple comme une application WSGI. Dans votre code original vous a renvoyé un
Query
objet, car la disparition de l'appel àscalar()
ou tel et ce fut alors traité comme une application WSGI.C'est effectivement une erreur séparée. Votre point de vue vous attend pour retourner un callable d'une certaine sorte, il me semble. J'ai 0 expérience avec Flacon en général, vous devez consulter la documentation de ce que votre vue est de retour.
Quant à la façon dont vous obtenez
TypeError: user() takes no arguments (2 given)
je ne peux pas dire une chose sans voir ce que vous avez réellement fait. Il semblerait que la fonction de visualisation en est passé des arguments bien qu'il s'attend à aucun.En fait, la lecture de flask.pocoo.org/docs/0.10/quickstart/#about-responses et surtout, comment il gère tout, mais un objet de réponse, une chaîne ou un n-uplet: "Si rien de tout cela fonctionne, Flacon assumera la valeur de retour est valable application WSGI et de les convertir en un objet de réponse.". Donc je suppose que votre
User.id
est un entier et le Flacon est d'essayer de les traiter que comme une véritable application WSGI. Essayezreturn str(user_id)
.très intéressant, merci! retour str(user_id) fonctionne. Aperçu fascinant.
OriginalL'auteur Ilja Everilä
Que vous avez à faire quelque chose le long de ces lignes:
OriginalL'auteur Tkingovr
De requête le contenu d'une colonne au lieu de l'ensemble de la table en flacon de sqlalchemy, qui, je suppose, peut vous donner un indice sur sqlalchemy lui-même serait le travail vous amène à interroger la session comme vous le faites, avec une syntaxe différente.
Si votre table ressemble à quelque chose comme:
Vous pouvez interroger:
Cela renvoie une liste de tous les Id d'Utilisateur.
OriginalL'auteur ciacicode
Le problème n'a rien à voir avec les requêtes de base de données et de connexion. À l'intérieur de @application.route("/utilisateur", les méthodes=['GET', 'POST']) déclaration de retourner un user_id qui est un résultat d'une sélection à partir de la base de données. Dans le Flacon, il faut retourner quelque chose approprié.
OriginalL'auteur Alexey Smirnov