sqlalchemy: AttributeError: objet 'tuple' n'a pas d'attribut 'insert'
-
11-09-2019 - |
Question
Je jouais autour de faire un site simple de Haiku utilisant sqlalchemy et pylônes. Il faut essentiellement un haïku, il écrit dans une base de données et affiche le haïku. Le problème apparaît lorsque je reçois les données du formulaire et essayer de l'écrire à une base de données, Pylônes me donner cette erreur: AttributeError: objet « tuple » n'a pas d'attribut « insert » après je lance cette ligne de code: ins = auto. haiku_table.insert (valeurs = form_dict)
Main Code:
import logging
from pylons import request, response, session, tmpl_context as c
from pylons.controllers.util import abort, redirect_to
from myku.lib.base import BaseController, render
from sqlalchemy.sql import select
import meta
import myku.lib.helpers as h
log = logging.getLogger(__name__)
class IndexController(BaseController):
def __init__(self):
self.haiku_table = meta.haiku_table
self.conn = meta.engine.connect()
BaseController.__init__(self)
def index(self, genre, title):
ss = select([self.haiku_table], self.haiku_table.c.genre==str(genre).lower(), self.haiku_table.c.title==str(title).lower())
result = self.conn.execute(ss)
return result
def new_haiku(self):
return render('/newku.html')
def submit(self):
title = request.params.get('title')
haiku = request.params.get('haiku')
genre = request.params.get('genre')
author = request.params.get('author')
form_dict = {'title': title, 'haiku': haiku, 'genre': genre, 'author': author}
ins = self.haiku_table.insert(values=form_dict)
result = self.conn.execute(ins)
return res
et le code pour le fichier meta:
from sqlalchemy.engine import create_engine
from sqlalchemy import schema, types
metadata = schema.MetaData()
haiku_table = ('haiku', metadata,
schema.Column('title', types.Text(), primary_key=True),
schema.Column('haiku', types.Text()),
schema.Column('genre', types.Text()),
schema.Column('author', types.Text())
)
engine = create_engine('sqlite:///F:\\MyKu\\myku\\haiku')
metadata.bind = engine
metadata.create_all(checkfirst=True)
Toutes les idées? Je n'ai pas la moindre idée
La solution
Eh bien, il semble que vous créez haiku_table
et ne fait rien d'autre à essayer avant d'utiliser la fonction .insert qui est évidemment pas partie d'un tuple
On dirait que lorsque vous créez une table avec SQLAlchemy, vous voulez que le format suivant:
haiku_table = Table('haiku', metadata,
schema.Column('title', types.Text(), primary_key=True),
.... etc
)
Vous devez importer Table
à partir du module sqlachlemy ainsi.
Cela rend haiku_table être une instance de table de SQLAlchemy et non pas simplement un tuple. Je pense que c'est tout ce que vous manquez.