Python 金字塔,炼金术

Python 金字塔,炼金术,python,session,sqlalchemy,pyramid,Python,Session,Sqlalchemy,Pyramid,在构建金字塔应用程序(SQLAlchemy作为ORM)时,我遇到了一个似乎无法解决的问题。 使用SQLAlchemy脚手架构建项目,因此所有设置都是正确的。 当我在视图或类似视图中使用DBSession变量时,它会正常工作。 例如: from pabsite.models import DBSession .... @view_config(route_name='admin_class', renderer='admin_class.mako') def admin_class(request

在构建金字塔应用程序(SQLAlchemy作为ORM)时,我遇到了一个似乎无法解决的问题。
使用SQLAlchemy脚手架构建项目,因此所有设置都是正确的。
当我在视图或类似视图中使用DBSession变量时,它会正常工作。
例如:

from pabsite.models import DBSession
....
@view_config(route_name='admin_class', renderer='admin_class.mako')
def admin_class(request):
    db_class = eval(request.matchdict['db_class'])
    class_objects = DBSession.query(db_class).all()
    return {'db_class':db_class, 'class_objects':class_objects, "db_class_name":request.matchdict['db_class']}
现在,当我尝试创建一个新的非SQLAlchemy类时,问题出现了,如:

from pabsite.models import DBSession
.....
class AdminPost(colander.MappingSchema):
    tester = DBSession.query(Post).all()
    title = colander.SchemaNode(colander.String(),
                                       validator=colander.Length(max=100),
                                       widget = get_inputbox(),
                                       description='Tytuł')
当我想运行应用程序时,我被击中了:

  File "/media/stuff/Projects/current/web/PabsiteProject/pabsite/pabsite/__init__.py", line 1, in <module>
    from pabsite.admin.views import admin_routes
  File "/media/stuff/Projects/current/web/PabsiteProject/pabsite/pabsite/admin/views.py", line 9, in <module>
    from models import getAdminPost
  File "/media/stuff/Projects/current/web/PabsiteProject/pabsite/pabsite/admin/models.py", line 13, in <module>
    class AdminPost(colander.MappingSchema, Base):
  File "/media/stuff/Projects/current/web/PabsiteProject/pabsite/pabsite/admin/models.py", line 14, in AdminPost
    tester = DBSession.query(Post).all()
.....
sqlalchemy.exc.UnboundExecutionError: Could not locate a bind configured on mapper Mapper|Post|posts, SQL expression or this Session
现在,我将select小部件(我希望它们在其他类中重用)定义为:

这里是我前面提到的错误。这可能是我对使用Python的误解,但我不知道如何让DBSession了解应用程序引擎的配置。
编辑2 Category是一个db模型,而AdminPost类服务器是一个变形模型。 这是def

class Category(Base):
    __tablename__ = 'categories'
    id = Column(Integer, primary_key=True)
    name = Column(String(150))
    slug = Column(String(150))
    name_en = Column(String(150))
    slug_en = Column(String(150))

    def __init__(self,name=''):
        self.name = name

    def __repr__(self):
        return self.name
他们怎么能共享同一个父母,因为他们的目的不同

编辑4

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

它们被定义为应用程序根目录中models.py中的金字塔脚手架。这就是我从中导入它们的地方,它们确实可以工作,但是在视图中,而不是在我在deform上准备的类中。

您的问题在于python的工作方式以及您在这里试图实现的目标。我假设您希望
AdminPost.tester
始终包含
Post
表中所有项目的最新列表

让我们逐一解决这些问题。首先,声明

class AdminPost(colander.MappingSchema):
    tester = DBSession.query(Post).all()
将在导入时执行。看看这个:

print "Before import"
import some_module
print "After import"
some_module.SomeClass()
某个模块
如下所示:

class A(object):
    print "Inside A"
    def __init__(self):
        print "New instance of A"
这是您将获得的输出:

Before import
Inside A
After import
New instance of A
其原因是python解析代码的方式:它执行它找到的每个语句,但遇到
def
时,它不会计算任何缩进的语句。(这是一个粗略的描述!)

现在您已经看到了这一点,您知道您的查询(很可能)是在启动程序时执行的。此时,sqlalchemy还没有找到它的所有表并为其进行配置。此外,您很可能还没有绑定引擎

但你的问题实际上与炼金术无关。对于如何定义类的每个实例都应该作为默认值的值,这是一个常见的误解。在Python中,您可以在
\uuuu init\uuu
中执行此操作:

class AdminPost(colander.MappingSchema):
    def __init__(self, *args, **kwargs):
        tester = DBSession.query(Post).all()
        colander.MappingSchema.__init__(self, *args, **kwargs)

最后一行确保随后调用默认构造函数。

您的问题在于python的工作方式以及您在这里试图实现的目标。我假设您希望
AdminPost.tester
始终包含
Post
表中所有项目的最新列表

让我们逐一解决这些问题。首先,声明

class AdminPost(colander.MappingSchema):
    tester = DBSession.query(Post).all()
将在导入时执行。看看这个:

print "Before import"
import some_module
print "After import"
some_module.SomeClass()
某个模块
如下所示:

class A(object):
    print "Inside A"
    def __init__(self):
        print "New instance of A"
这是您将获得的输出:

Before import
Inside A
After import
New instance of A
其原因是python解析代码的方式:它执行它找到的每个语句,但遇到
def
时,它不会计算任何缩进的语句。(这是一个粗略的描述!)

现在您已经看到了这一点,您知道您的查询(很可能)是在启动程序时执行的。此时,sqlalchemy还没有找到它的所有表并为其进行配置。此外,您很可能还没有绑定引擎

但你的问题实际上与炼金术无关。对于如何定义类的每个实例都应该作为默认值的值,这是一个常见的误解。在Python中,您可以在
\uuuu init\uuu
中执行此操作:

class AdminPost(colander.MappingSchema):
    def __init__(self, *args, **kwargs):
        tester = DBSession.query(Post).all()
        colander.MappingSchema.__init__(self, *args, **kwargs)

最后一行确保在之后调用默认构造函数。

我已经发布了一个答案,可以解决您的问题,但是您试图做的事情似乎很奇怪。也许你可以详细说明你的目标,这样我们也可以提供帮助。你编辑的例外情况会很有趣,因为像这样我看不到这个问题。还显示
类别
的类定义:它必须与
AdminPost
具有相同的父级(SQLALchemy
声明性基础
)。第二次编辑-发布信息。谢谢你的关心我愚蠢的评论,我把它搞混了:当然他们不需要有同一个父母,我的坏孩子。关于您的问题:您是否实际绑定了一个引擎,例如
DBSession.configure(bind=engine)
其中的引擎类似于
create_engine(“sqlite://”)
?或者您的错误消息已更改?已更新。我搞砸了(将函数作为一个方法移动到类中),但错误仍然是sqlalchemy.exc.UnboundExecutionError:找不到在SQL表达式上配置的绑定,或者此会话我发布了一个解决问题的答案,但您尝试的操作似乎很奇怪。也许你可以详细说明你的目标,这样我们也可以提供帮助。你编辑的例外情况会很有趣,因为像这样我看不到这个问题。还显示
类别
的类定义:它必须与
AdminPost
具有相同的父级(SQLALchemy
声明性基础
)。第二次编辑-发布信息。谢谢你的关心我愚蠢的评论,我把它搞混了:当然他们不需要有同一个父母,我的坏孩子。关于您的问题:您是否实际绑定了一个引擎,例如
DBSession.configure(bind=engine)
其中的引擎类似于
create_engine(“sqlite://”)
?或者您的错误消息已更改?已更新。我搞砸了(将函数作为方法移动到类中),但错误仍然存在,即sqlalchemy.exc.UnboundExecutionError:找不到在SQL表达式或此会话上配置的绑定。有关一个愚蠢的示例,请参阅。我编辑了我的问题以反映真实情况。非常感谢你花时间解决我的问题,但我自己解决了。通过在DBSession初始化之后移动视图导入,问题得以解决。这样,在初始化DBSession并在