Python SQLAlchemy Requête: AttributeError: 'Connexion' objet n'a pas d'attribut "contextual_connect'
Je suis en train de suivre ce tutoriel de SQLAlchemy
sur la façon de créer des entrées dans le et d'interroger une base de données MYSQL en python. Lorsque j'essaie de requête et de la base de données pour la première fois à la suite le long de leur l'ajout de nouveaux objets section pour tester si un objet a été ajouté à la base de données (voir gros bloc de code ci-dessous), j'obtiens l'erreur suivante: AttributeError: 'Connection' object has no attribute 'contextual_connect'
Je peux interroger la base de données. Par exemple, si je change la dernière ligne de code à our_user = session.query(User).filter_by(name='ed')
elle renvoie un objet de requête, mais je ne peux pas comprendre comment obtenir l'objet, je suis entré dans la base de données de ce résultat de la requête.
De même, si j'essaie de faire une boucle sur les résultats qu'ils proposent dans leur l'interrogation
section:
for instance in session.query(User).order_by(User.id):
print instance.name, instance.fullname
Je reçois la même erreur. Comment puis-je corriger cette erreur et existe-il d'autres tutoriels sur l'utilisation de MYSQL en Python avec SQLAlchemy que vous pourriez m'indiquer?
Mon code:
import MySQLdb
from sqlalchemy import create_engine
db1 = MySQLdb.connect(host="127.0.0.1",
user="root",
passwd="****",
db="mydata")
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
ed_user = User('ed', 'Ed Jones', 'edspassword')
from sqlalchemy.orm import sessionmaker
Session = sessionmaker()
Session.configure(bind=db1)
session = Session()
session.add(ed_user)
our_user = session.query(User).filter_by(name='ed').first()
Mise À Jour/Code De Travail:
(1) Variation à SQLAlchemy moteur tel que discuté par codeape ci-dessous.
(2) n'oubliez pas de créer la table: Base.metadata.create_all(engine)
(3) Utilisez la "infaillible" version de la User
classe de SQLAlchemy du tutoriel. Note à SQLAlchemy, nous (du moins je) se sentir comme un imbécile et tiens à vous d'utiliser d'utiliser toujours de la à toute épreuve de version dans le corps principal de votre tutoriel et pas que d'un côté que d'un lecteur occupé peut sauter par-dessus.
Tout ce que les rendements de code de travail:
import MySQLdb
from sqlalchemy import create_engine
engine = create_engine("mysql://user:password@host/database")
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String, Sequence
class User(Base):
__tablename__ = 'users'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
name = Column(String(50))
fullname = Column(String(50))
password = Column(String(12))
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
Base.metadata.create_all(engine)
ed_user = User('ed', 'Ed Jones', 'edspassword')
from sqlalchemy.orm import sessionmaker
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
session.add(ed_user)
our_user = session.query(User).filter_by(name='ed').first()
print(our_user is ed_user)
- Vous n'avez pas besoin de la
import MySQLdb
déclaration. - J'ai eu le même problème mais j'ai en boucle sur la
sessionmaker
objet. La boucle doit s'exécuter sur le minusculesession
dans cet exemple. Qui me troublait un peu.for instance in session.query(User).filter_by(name='ed'): print(our_user is ed_user)
Vous devez vous connecter pour publier un commentaire.
Vous devez lier à la session d'un SQLAlchemy moteur, non pas directement à un MySQLDb objet de connexion.
(Vous pouvez supprimer votre
db1
variable).Du tutoriel:
Voir aussi https://docs.sqlalchemy.org/en/latest/orm/tutorial.html
ProgrammingError: (ProgrammingError) (1146, "Table 'mydata.users' doesn't exist") 'INSERT INTO users (name, fullname, password) VALUES (%s, %s, %s)' ('ed', 'Ed Jones', 'edspassword')
Alors j'ai regardé le tutoriel et a ajoutéBase.metadata.create_all(engine)
pour créer la table dans la base de données après la définition de laUser
classe. Cette ligne génère l'erreur suivante:CompileError: (in table 'users', column 'name'): VARCHAR requires a length on dialect mysql
String
constructeur:name = Column(String(length=100))