我正在为一些web应用开发大型后端。这是我的第一个python和SQLAlchemy项目,因此我对一些事情感到困惑。与python相比,它被Java编程工具和IDE所破坏(无论如何,我在eclipse中使用pydev)。我需要帮助如何组织项目和编写测试。我先描述一下情况。在
在PyDev中,我将我的项目命名为“ProjectName”,下面我展示了我当前的文件夹/包和文件结构。在
我在SQLAlchemy中使用声明式样式。Foo和Bar是一些类,比如Foo扩展SQLAlchemy声明性Base,Bar扩展Foo。在'projectname.some_包'在它的's\uu init_uu.py中,我有以下代码:
engine = create_engine('mysql+mysqldb://user:pass@localhost:3306/SomeDataBase', pool_recycle=3600)
Session = sessionmaker(bind=engine)
Base = declarative_base()
所以,Foo导入并扩展这个基,Bar导入Foo并扩展它。我的第一个问题是,我是否应该将Base存储在那个u init_uuy.py中,然后像开始使用这两个类一样使用它?这个create_引擎只是临时的,我想有配置文件并从那里加载它的设置,怎么做?我该打电话到哪里Base.metadata.create_全部(),所以它可以一次创建所有数据库表?在
接下来,在测试类中,例如在TestFoo中,我有以下代码:
^{pr2}$然后我在那个测试类中有一些测试方法,它运行得很好。在TestBar类中的区别是
Foo.metadata.create_all(bind=self.engine)
是:
Bar.metadata.create_all(bind=self.engine)
当我运行TestBar时,它也运行得很好。但是,当我选择两个测试类并运行它们时,会出现错误:
/usr/local/lib/python2.7/dist-packages/sqlalchemy/ext/declarative.py:1336: SAWarning: The classname 'Foo' is already in the registry of this declarative base, mapped to <class 'projectname.some_package.Foo.Foo'>
_as_declarative(cls, classname, cls.__dict__)
/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py:330: Warning: Field 'id' doesn't have a default value
cursor.execute(statement, parameters)
这里有什么问题?我试着用nose和pydev运行程序运行测试,得到了相同的错误。然后,我试图将数据库表的创建移动到单元测试下的某个_包中的\u init_u.py中,但我无法使其正常工作。另外,我对python导入的工作原理感到困惑。例如,如果我在TestBar类中添加Foo import,我也会得到与我已经显示的类似的错误。如何一次运行多个测试SQLAlchemy类的单元测试?在
因此,再次引出最重要的问题:
非常感谢你的帮助。在
快速回答(很抱歉,时间不够):使用单个元数据实例,而不是同时为Foo和Bar使用一个。一般来说,多个元数据实例是一种高级技巧,您几乎不需要。在
相关问题 更多 >
编程相关推荐