Python SQLAlchemy Query: AttributeError: объект «Connection» не имеет атрибута «contextual_connect»

Я пытаюсь следовать этому руководству SQLAlchemy о том, как создавать записи и запрашивать базу данных MYSQL в python. Когда я впервые пытаюсь выполнить запрос к базе данных в следующем разделе добавления новых объектов, чтобы проверить, был ли объект добавлен в базу данных (см. Большой блок кода ниже), я получаю следующую ошибку: AttributeError: 'Connection' object has no attribute 'contextual_connect'

Я могу запросить базу данных. Например, если я изменю окончательную строку кода на our_user = session.query(User).filter_by(name='ed') он успешно возвращает объект запроса, но я не могу понять, как получить объект, который я ввел в базы данных из этого результата запроса.

Аналогичным образом, если я попытаюсь просмотреть результаты, как они предлагают в разделе запросов :

 for instance in session.query(User).order_by(User.id): print instance.name, instance.fullname 

Я получаю ту же ошибку. Как я могу исправить эту конкретную ошибку и есть ли какие-либо другие руководства по использованию MYSQL в Python с SQLAlchemy, на которые вы могли бы указать мне?

Мой код:

 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() 

Обновление / Рабочий код:

(1) Перейдите в SQLAlchemy, как описано ниже.

(2) Не забудьте создать таблицу: Base.metadata.create_all(engine)

(3) Используйте «надежную» версию класса User из учебника SQLAlchemy. Обратите внимание на SQLAlchemy, мы (по крайней мере, я) чувствуем себя дураком и хотели бы, чтобы вы использовали, чтобы всегда использовать надежную версию в основной части вашего учебника, а не как в сторону, которую может пропустить занятый читатель.

Все, что дает рабочий код:

 import MySQLdb from sqlalchemy import create_engine engine = create_engine("mysql://user:[email protected]/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) 

Вы должны привязать сессию к движку SQLAlchemy, а не непосредственно к объекту соединения MySQLDb.

 engine = create_engine("mysql://user:[email protected]/dbname") Session.configure(bind=engine) 

(Вы можете удалить переменную db1 .)

Из учебника:

Возвращаемое значение create_engine () является экземпляром Engine и представляет собой основной интерфейс к базе данных, адаптированный через диалект, который обрабатывает детали используемой базы данных и DBAPI.

См. Также http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html