gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:12 25 4
gpt4 key购买 nike

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

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

  • 项目名称
    • 项目名称
      • __初始化__.py
      • 一些包
        • __初始化__.py
        • Foo.py
        • 酒吧.py
    • 测试
      • 单元测试
        • __初始化__.py
        • 一些包
          • __初始化__.py
          • TestFoo.py
          • 测试栏.py
      • 负载测试
      • 整合测试
      • __初始化__.py

我在 SQLAlchemy 中使用声明式风格。 Foo 和 Bar 是一些类,例如 Foo 扩展了 SQLAlchemy 声明性 Base,而 Bar 扩展了 Foo。在“projectname.some_package”下的 __init__.py 我有这段代码:

engine = create_engine('mysql+mysqldb://user:pass@localhost:3306/SomeDataBase', pool_recycle=3600)
Session = sessionmaker(bind=engine)
Base = declarative_base()

所以,Foo 导入这个 Base 并扩展它,而 Bar 导入 Foo 并扩展它。我的第一个问题是,我应该将 Base 存储在那个 __init__.py 中并像我开始使用这两个类一样使用它吗?这个 create_engine 在那里只是临时的,我想要配置文件并从那里加载它的设置,该怎么做?我应该在哪里调用 Base.metadata.create_all(),以便它可以一次创建所有数据库表?

接下来,在测试类中,例如在 TestFoo 中,我有以下代码:

def setUp(self):
#create database tables and session object
self.engine = create_engine('mysql+mysqldb://user:pass@localhost:3306/SomeDatabase', pool_recycle=3600)
Session = sessionmaker(bind=self.engine)
Foo.metadata.create_all(bind=self.engine)
self.session = Session()

def tearDown(self):
#drop all tables and close session object
self.session.close()
meta = MetaData(self.engine)
meta.reflect()
meta.drop_all()

结束然后我在那个测试类中有一些测试方法并且它运行良好。在 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 runners 运行测试并得到相同的错误。然后我尝试在 unit_tests 下的 some_package 中的 __init__.py 中移动数据库表创建,但我无法让它工作。另外,我对 python import 的工作原理感到困惑。例如,如果我在 TestBar 类中添加 Foo 导入,我也会收到类似于我已经显示的错误。如何同时运行多个测试 SQLAlchemy 类的单元测试?

所以再次提取最重要的问题:

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

非常感谢您的帮助。

最佳答案

快速回答(抱歉,没时间):使用单个 MetaData 实例,而不是同时为 Foo 和 Bar 使用一个实例。通常,多个元数据实例是您几乎不需要的高级技巧。

关于python - 如何正确构建 SQLAlchemy(声明式)python 项目及其单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9215290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com