Python sqlalchemy教程示例不起作用
我试图通过中给出的示例来解决问题,但我遇到了一些错误。据我所知,我正在不折不扣地遵循这个榜样。这是迄今为止我从中得到的代码。在查询数据库后,当IPython sqlalchemy教程示例不起作用,python,sqlalchemy,Python,Sqlalchemy,我试图通过中给出的示例来解决问题,但我遇到了一些错误。据我所知,我正在不折不扣地遵循这个榜样。这是迄今为止我从中得到的代码。在查询数据库后,当I.first()时,它会失败 我使用的是版本0.7.5和python 2.7 from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base from sqlalchemy
.first()
时,它会失败
我使用的是版本0.7.5和python 2.7
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('sqlite:///:memory:', echo=True)
engine.execute("select 1").scalar() # works fine
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()
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)
jeff_user = User("jeff", "Jeff", "foo")
session.add(jeff_user)
our_user = session.query(User).filter_by(name='jeff').first() # fails here
jeff_user.password = "foobar"
session.add_all([
User('wendy', 'Wendy Williams', 'foobar'),
User('mary', 'Mary Contrary', 'xxg527'),
User('fred', 'Fred Flinstone', 'blah')])
session.dirty # shows nothing as dirty
session.new # shows nothing as new
来自sqlalchemy导入列,整数,字符串
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy导入创建引擎
从sqlalchemy.orm导入sessionmaker
engine=create_engine('sqlite://:memory:',echo=True)
engine.execute(“select 1”).scalar()工作正常
会话=会话生成器(绑定=引擎)
会话=会话()
Base=声明性_Base()
类用户(基本):
__tablename_uu='users'
id=列(整数,主键=True)
名称=列(字符串)
fullname=列(字符串)
密码=列(字符串)
定义初始化(self、name、fullname、password):
self.name=名称
self.fullname=fullname
self.password=密码
定义报告(自我):
返回“”%(self.name、self.fullname、self.password)
jeff_user=用户(“jeff”、“jeff”、“foo”)
session.add(jeff_用户)
我们的_user=session.query(user).filter_by(name='jeff')。first()在这里失败
jeff_user.password=“foobar”
session.add_all([
用户('wendy','wendy Williams','foobar'),
用户('mary'、'mary'、'xxg527'),
用户('fred','fred Flinstone','blah'))
session.dirty#没有显示脏的内容
session.new#没有显示任何新内容
这是错误消息
2012-02-25 17:48:33,879 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2012-02-25 17:48:33,886 INFO sqlalchemy.engine.base.Engine INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
2012-02-25 17:48:33,886 INFO sqlalchemy.engine.base.Engine ('jeff', 'Jeff', 'foo')
2012-02-25 17:48:33,887 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
File "learning_sql.py", line 35, in <module>
our_user = session.query(User).filter_by(name='ed').first() # fails here
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2024, in first
ret = list(self[0:1])
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 1918, in __getitem__
return list(res)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2092, in __iter__
self.session._autoflush()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 983, in _autoflush
self.flush()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1559, in flush
self._flush(objects)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 1630, in _flush
flush_context.execute()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 331, in execute
rec.execute(self)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 475, in execute
uow
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 2291, in _save_obj
execute(statement, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1405, in execute
params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1538, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1646, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1639, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 330, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (OperationalError) no such table: users u'INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)' ('jeff', 'Jeff', 'foo')
2012-02-25 17:48:33879信息sqlalchemy.engine.base.engine BEGIN(隐式)
2012-02-25 17:48:33886信息sqlalchemy.engine.base.engine插入用户(名称、全名、密码)值(?、、?)
2012-02-25 17:48:33886信息sqlalchemy.engine.base.engine('jeff','jeff','foo'))
2012-02-25 17:48:33887信息sqlalchemy.engine.base.engine回滚
回溯(最近一次呼叫最后一次):
文件“learning_sql.py”,第35行,在
我们的_user=session.query(user).filter_by(name='ed')。first()在这里失败
文件“/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py”,第2024行,第一行
ret=列表(自身[0:1])
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/query.py”,第1918行,在__
返回列表(res)
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/query.py”,第2092行,在__
self.session.\u autoflush()
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/session.py”,第983行,在自动刷新中
self.flush()
文件“/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py”,第1559行,刷新
自冲洗(对象)
文件“/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py”,第1630行,在
flush_context.execute()
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/unitofwork.py”,执行中的第331行
rec.execute(self)
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/unitofwork.py”,第475行,在execute中
uow
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/orm/mapper.py”,第2291行,在保存对象中
执行(语句,参数)
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/engine/base.py”,执行中的第1405行
参数)
文件“/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py”,第1538行,在“执行”子句元素中
编译的sql,提取的参数
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/engine/base.py”,第1646行,在执行上下文中
(上下文)
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/engine/base.py”,第1639行,在执行上下文中
(上下文)
文件“/usr/local/lib/python2.7/dist packages/sqlalchemy/engine/default.py”,第330行,在do_execute中
cursor.execute(语句、参数)
sqlalchemy.exc.OperationalError:(OperationalError)没有这样的表:用户u'插入用户(名称、全名、密码)值(?,,?)'('jeff','jeff','foo'))
预期的打印输出如下所示
>>> our_user = session.query(User).filter_by(name='ed').first()
BEGIN (implicit)
INSERT INTO users (name, fullname, password) VALUES (?, ?, ?)
('ed', 'Ed Jones', 'edspassword')
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
WHERE users.name = ?
LIMIT 1 OFFSET 0
('ed',)
>>> our_user
<User('ed','Ed Jones', 'edspassword')>
>>我们的用户=session.query(user).filter\u by(name='ed').first()
开始(隐式)
在用户(姓名、全名、密码)中插入值(?、、?)
(“ed”、“ed Jones”、“edspassword”)
选择users.id作为users\u id,users.name作为users\u name,users.fullname作为users\u fullname,users.password作为users\u password
来自用户
其中users.name=?
限制1偏移量0
(‘ed’,)
>>>我们的用户
由于某些原因,我的代码在应该选择时导致回滚。您会遇到此错误,因为数据库缺少表结构(您在教程中显然错过了这一行,它在声明映射小节中)。通过在表/模型定义之后添加以下内容来创建架构:
Class User(Base)
...
# Initialize database schema (create tables)
Base.metadata.create_all(engine)
为了扩展您的答案,在我的例子中,我创建了另一个基,但是由于这个类来自
Base=declarative\u Base()
,您需要使用为您的对象扩展的相同基调用create\u all,因为它可能重复