Mic*_*ael 4 python mysql database orm sqlalchemy
我试图从如何在python中创建条目和查询MYSQL数据库的本教程SQLAlchemy.当我第一次尝试查询数据库时,在添加新对象部分以测试是否已将对象添加到数据库中(请参阅下面的大代码块),我收到以下错误: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
Run Code Online (Sandbox Code Playgroud)
我犯了同样的错误.我该如何修复这个特定的错误,是否有任何其他关于在Python中使用MYSQL和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()
Run Code Online (Sandbox Code Playgroud)
更新/工作代码:
(1)更改为SQLAlchemy引擎,如下面的代码所述.
(2)记得创建表格: Base.metadata.create_all(engine)
(3)使用UserSQLAlchemy教程中的"万无一失"版本.请注意SQLAlchemy,我们(至少我)觉得自己像个傻瓜一样,希望你能够总是在教程的主体中使用万无一失的版本而不是忙碌的读者可能会跳过这个版本.
所有产生工作代码:
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)
Run Code Online (Sandbox Code Playgroud)
您必须将会话绑定到SQLAlchemy引擎,而不是直接绑定到MySQLDb连接对象.
engine = create_engine("mysql://user:password@host/dbname")
Session.configure(bind=engine)
Run Code Online (Sandbox Code Playgroud)
(您可以删除您的db1变量.)
从教程:
create_engine()的返回值是Engine的一个实例,它表示数据库的核心接口,通过处理数据库和正在使用的DBAPI的详细信息的方言进行调整.
另见http://docs.sqlalchemy.org/en/rel_0_8/core/engines.html