我正在阅读和测试sqlalchemy的教程,一切都进行得很好,直到我尝试获取我先前添加到数据库中的值。当我这样做时,我收到一条错误消息:
OperationalError: (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block if this flush is occurring prematurely)
(sqlite3.OperationalError) no such table: userss
如果我使用关闭功能关闭会话,我会得到这个:
OperationalError: (sqlite3.OperationalError) no such table: userss
[SQL: SELECT userss.id AS userss_id, userss.name AS userss_name, userss.fullname AS userss_fullname, userss.nickname AS userss_nickname
这是我的代码
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String
engine=create_engine('sqlite:///prueba.db')
Base = declarative_base()
Session=sessionmaker(bind=engine)
#defining a extension of declarative base
class User(Base):
__tablename__ ='userss'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
nickname=Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', nickname='%s')>" % (
self.name, self.fullname, self.nickname)
#makin a session
session = Session()
ed_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
session.add(ed_user)
#when line below is uncommented, the error changes
#session.close()
our_user = session.query(User).filter_by(name='ed').first()
当我将first()
应用于session.query(User).filter_by(name='ed')
时出现错误,但是当我不这样做时,我得到了query.filter对象。我读过一些类似的问题,但在User类的定义中没有错字错误。我该如何解决?非常感谢!
似乎未创建表。
Base.metadata.create_all(bind=engine)
进行以下更改即可:
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, Integer, String
engine=create_engine('sqlite:///prueba.db')
Base = declarative_base()
Session=sessionmaker(bind=engine)
#defining a extension of declarative base
class User(Base):
__tablename__ ='userss'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
nickname=Column(String)
def __repr__(self):
return "<User(name='%s', fullname='%s', nickname='%s')>" % (
self.name, self.fullname, self.nickname)
# initialize tables
Base.metadata.create_all(bind=engine)
#makin a session
session = Session()
ed_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
session.add(ed_user)
#when line below is uncommented, the error changes
#session.close()
our_user = session.query(User).filter_by(name='ed').first()
print(our_user)