2013-10-09 3 views
2

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

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

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

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

Update/Рабочий код:

(1) Изменение к двигателю SQLAlchemy, как обсуждалось codeape ниже.

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

Вам не нужно '' импорта MySQLDb '' заявление. – codeape

+0

У меня была такая же проблема, но я зациклился на объекте 'sessionmaker'. В этом примере цикл должен выполняться в нижнем регистре 'session'. Это немного смутило меня. 'например, в session.query (User) .filter_by (name = 'ed'): print (our_user is ed_user)' – kkuilla

ответ

4

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

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

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

Из учебника:

The return value of create_engine() is an instance of Engine, and it represents the core interface to the database, adapted through a dialect that handles the details of the database and DBAPI in use.

Смотрите также http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html

+0

Я внес изменения, которые вы предложили, и я получил ошибку: 'ProgrammingError: (ProgrammingError) (1146, «Таблица« mydata.users »не существует») «INSERT INTO users (имя, полное имя, пароль) VALUES (% s,% s,% s)» («ed», «Ed Jones», «edspassword») «Итак, я посмотрел учебник и добавил« Base.metadata.create_all (engine) »для создания таблицы в базе данных после определения класса« Пользователь ».В этой строке появляется следующая ошибка: 'CompileError: (в таблице 'users', column 'name'): VARCHAR требует длины на диалекте mysql' – Michael

+0

Укажите длину в конструкторе' 'String'':' 'name = Column (String (длина = 100)) '' – codeape

-1
from sqlalchemy.orm import sessionmaker 

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

session = Session() 
+1

Благодарим вас за этот фрагмент кода, который может оказать немедленную помощь. Правильное объяснение [значительно улучшило бы] (https://meta.stackexchange.com/q/114762) его образовательное значение, показывая, почему это является хорошим решением проблемы, и сделало бы его более полезным для будущих читателей с похожими, но не идентичные вопросы. Измените свой ответ, чтобы добавить объяснения, и укажите, какие ограничения и допущения применяются. – GrumpyCrouton

Смежные вопросы