如何正确构造SQLAlchemy(声明式风格)python项目及其单元测试

2024-05-17 19:45:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一些web应用开发大型后端。这是我的第一个python和SQLAlchemy项目,因此我对一些事情感到困惑。与python相比,它被Java编程工具和IDE所破坏(无论如何,我在eclipse中使用pydev)。我需要帮助如何组织项目和编写测试。我先描述一下情况。在

在PyDev中,我将我的项目命名为“ProjectName”,下面我展示了我当前的文件夹/包和文件结构。在

  • 项目名称
    • 项目名称
      • __初始值
      • 一些你的包
        • __初始值
        • 在食品在
        • 在棒.py在
    • 测试
      • 单元测试
        • __初始值
        • 一些你的包
          • __初始值
          • 在试验食品.py在
          • 在测试条.py在
      • 负载测试
      • 集成测试
      • __初始值

我在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类的单元测试?在

因此,再次引出最重要的问题:

  1. 如何正确构造使用SQLAlchemy声明式样式和unittests的python项目。顺便说一句,我在Foo和Bar中有很多类方法可以与数据库交互,在它们各自的类的上下文中,我希望可以吗?在
  2. 在哪里存储基本声明类,如何在整个项目中正确使用它,以及如何在项目中的任何地方提取并使用所有数据库模式(我在类中以声明方式定义的模式)?在
  3. 如何在SQLAlchemy中最好地使用单元测试并同时运行多个单元测试?在
  4. 如果你有其他的建议,可以随意添加吗?在

非常感谢你的帮助。在


Tags: 项目py数据库声明basefoosqlalchemyinit
1条回答
网友
1楼 · 发布于 2024-05-17 19:45:35

快速回答(很抱歉,时间不够):使用单个元数据实例,而不是同时为Foo和Bar使用一个。一般来说,多个元数据实例是一种高级技巧,您几乎不需要。在

相关问题 更多 >