SQLAlchemy 和多数据库

2023-12-21

我有各种类似(但不相同)的数据库,并且想使用 SQLAlchemy 作为“标准化”访问的方式。数据库可能略有不同,例如列名上有唯一的前缀,或者它们可能有更大的差异并且缺少列(或者对于旧数据库,缺少整个表)。

我寻求帮助的与其说是 SQLAlchemy 问题,不如说是 Python/组织问题。如何设置可以在项目中轻松重用的多个数据库?

我读过有关 SQLAlchemy 会话的内容,但无法找到使用这些会话而不在每个项目中实例化它们的方法。

我的问题是:我怎样才能制作一个模块/包,其中包含许多要在 SQLAlchemy 中使用的数据库模型设置,并且可以在另一个 python 项目中轻松导入/使用?

到目前为止,我还不太担心处理丢失的列/表。我可以稍后解决这个问题,但需要记住这一点,因为我不能为每个数据库使用完全相同的模型。

任何有关此主题的资源、指示或阅读材料都将受到真正的赞赏。提前致谢,如果其他地方已经回答了这个问题,我很抱歉,搜索没有显示与此相关的任何内容。

EDIT:我完好无损地保留了原来的内容,并根据保罗的建议添加了更多内容。

RE: SA ORM - 是的,我计划使用 SQLAlchemy ORM。由于可能显而易见的原因,我无法提供真实的数据库。然而,假设这三个虚构的数据库,恰当地命名为 DB1、DB2 和 DB3(我们假设每个数据库都有一个表,只有几列,而现实世界中两者都会有更多)。

每个数据库都有一个用户表,每个表中有几列。以下是表/列的一些 SQL 表示法:

DB1.user  --> DB1.user.id,      DB1.user.username,  DB1.user.email
DB2.user  --> DB2.user.id,      DB2.user.user_name, DB2.user.email
DB3._user --> DB3._user.userid, DB3._user.username, DB3.user.email_address

目前,我正在尝试将这些数据库分离为“模块化”,并且能够随时添加其他数据库。

我考虑了几个不同的文件组织方面(假设 __init__.py 在需要的地方存在,但为了简洁起见而省略),包括:

Databases         |    Databases            |    Databases
    DB1.py        |        DB1              |        DB1
    DB2.py        |            models.py    |            models
    DB3.py        |        DB2              |                user.py
                  |            models.py    |                anothertable.py
                  |        DB2              |        ...
                  |            models.py    |        DB3
                  |                         |            models
                  |                         |                user.py
                  |                         |                anothertable.py

我希望能够使用 SA ORM 访问这些数据库,并且当需要在 python 文件中使用这些数据库时,尽可能少地导入/声明。需要做类似的事情:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from Database import DB1, ..., DB[N]
db1_engine = create_engine('connect_string/db1')
db1_session = sessionmaker(bind=db1_engine)()
...
db3_engine = create_engine('connect_string/db3')
db3_session = sessionmaker(bind=db3_engine)()

这将非常麻烦,因为我将处理的不仅仅是三个数据库。我更希望已经为我解决了这个问题(也许在 __init__.py 文件中?)

能够访问和使用它类似于:

import Databases

Databases.DB1.session.query('blahblah')

会变得无限好。

EDIT2:我还知道在设置模型时如何解决数据库/列命名约定中的变体。这不是问题,但我确实提到了这一点,以便知道我不能只对多个数据库使用一个模型集。

我希望通过扩展这一点,我不会把水搅浑或让事情变得太混乱。感谢您花时间阅读它!

EDIT3: 我已经花更多的时间在这上面了。我通过以下方式设置了该项目:

Databases
    __init__.py
    databases.py
    settings.py
    DB1
        __init__.py
        models.py
    ...
    DB3
        __init__.py
        models.py

目前,我有一个数据库元组“安装”在 settings.py 文件中。每个条目都喜欢INSTALLED_DATABASES = ('DB1', ..., 'DB3')。当我完成更多模型时,它们会被添加到元组列表中。这允许我随时添加或删除内容。

我在 models.py 文件中设置了引擎和 sessios,并且有init.py每个数据库设置的文件from models import *.

在databases.py 文件中我有以下内容

class Databases(object):
    def __init__(self):
        for database in INSTALLED_DATABASES:
            setattr(self, database, __import__(database))

我现在可以通过以下方式使用这些:

from databases import Databases

db = Databases()

for qr in db.DB1.query(db.DB1.User):
    print qr.userid, qr.username

SQLAlchemy 允许我在定义模型时手动指定列名,这对我想要的标准化来说是一个巨大的好处。

我还有很多工作要做。我想创建强制模型验证的对象(即,是否存在字段?不存在的字段是否有默认值?等等),并更好地将其与我的 IDE 结合起来(目前还没有) )。但我已经走上了正确的道路。我想我会为那些可能想知道如何做与我相同的事情的人更新此内容。

抱歉这已经变得这么长了!

Cheers!


根据对我最初问题的要求,我进行了第三次编辑并使其成为我的答案。由于我不确定正确的协议,因此我将第三次编辑保留在上面。如果您已经阅读过 EDIT3,那么您就已经阅读了我的答案。

我已经设法在这方面多花了一些时间。我通过以下方式设置了该项目:

Databases
    __init__.py
    databases.py
    settings.py
    DB1
        __init__.py
        models.py
    ...
    DB3
        __init__.py
        models.py

目前,我有一个数据库元组“安装”在 settings.py 文件中。每个数据库条目都指定在INSTALLED_DATABASES = ('DB1', ..., 'DB3')。当我完成更多模型时,它们会被添加到元组列表中。这允许我随时添加或删除内容。

我在里面设置了引擎和会话models.py文件,并有__init.py__每个数据库的文件设置为from models import *.

在databases.py 文件中我有以下内容

class Databases(object):
    def __init__(self):
        for database in INSTALLED_DATABASES:
            setattr(self, database, __import__(database))

我现在可以通过以下方式使用这些:

from databases import Databases

db = Databases()

for qr in db.DB1.query(db.DB1.User):
    print qr.userid, qr.username

SQLAlchemy 允许我在定义模型时手动指定列名,这对我想要的标准化来说是一个巨大的好处。

我还有很多工作要做。我想创建强制模型验证的对象(即,是否存在字段?不存在的字段是否有默认值?等等),并更好地将其与我的 IDE 结合起来(目前还没有) )。但我已经走上了正确的道路。我想我会为那些可能想知道如何做与我相同的事情的人更新此内容。

抱歉这已经变得这么长了!

Cheers!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQLAlchemy 和多数据库 的相关文章

  • 在Python中使用字典作为switch语句[重复]

    这个问题在这里已经有答案了 我正在尝试使用字典用 Python 制作一个简单的计算器 这是我的代码 def default print Incorrect input def add a b print a b def sub a b pr
  • sklearn DeprecationWarning 数组的真值

    从文档中运行 rasa core 示例 python3 m rasa core run d models dialogue u models nlu default current 并在对话框中的每条消息后获取此错误输出 sklearn D
  • 如何测试使用 XCom 的 Apache Airflow 任务

    我正在尝试找出一种测试 DAG 的方法 其中有几个任务使用 XCom 进行通信 由于控制台命令只允许我从 DAG 运行任务 有没有一种方法可以测试通信而无需通过 UI 运行 DAG Thanks 这是一种对我有用的方法 尽管 Airflow
  • scipy.misc.imshow RuntimeError('无法执行图像视图')

    我正在测试scipy misc imshow https docs scipy org doc scipy 0 15 1 reference generated scipy misc imshow html我得到了运行时错误 无法执行图像查
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • 如何从 Lua 调用 Python 函数?

    我想从我的 lua 文件运行 python 脚本 我怎样才能实现这个目标 Example Python代码 sum py file def sum from python a b return a b Lua code main lua f
  • 检测/删除 Python 2 + GTK 中不成对的代理字符

    在Python 2 7中我可以成功转换Unicode字符串 abc udc34xyz 转换为 UTF 8 结果是 abc xed xb0 xb4xyz 但是当我将 UTF 8 字符串传递给例如时 pango parse markup or
  • 在 vim 折叠线中语法高亮 Python

    我发现代码折叠 http en wikipedia org wiki Code folding帮助我更好地组织我的文件 因此 在我的底部 vimrc 我启用vim代码折叠 http vimdoc sourceforge net htmldo
  • 使用 boto3 从 s3 下载时使用 filename 作为文件名

    我正在使用 boto3 上传文件 如下所示 client boto3 client s3 aws access key id id aws secret access key key client upload file tmp test
  • 如何在Python中求和

    我想知道如何在 python 中表示总和而不需要像这样的循环here http docs scipy org doc scipy reference tutorial optimize html 我们有 def rosen x The Ro
  • Flask 中的 import 和 extends 有什么区别?

    我正在阅读 Flask Web 开发 在例4 3中 extends base html import bootstrap wtf html as wtf 我想知道 extends 和 import 有什么区别 我认为它们在用法上很相似 在什
  • python-polars 通过分隔符将字符串列拆分为许多列

    在 pandas 中 以下代码会将 col1 中的字符串拆分为许多列 有没有办法在极地做到这一点 d col1 a b c d a b c d df pd DataFrame data d df a b c d df col1 str sp
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 使用 python 只读取 Excel 中的可见行

    我想只读取 python 中 Excel 工作表中的可见行 输入 Excel表 所以当我过滤时 作为 python 中的输出 在本例中我将仅获得可见数据 1 行 这是我的代码 from openpyxl import load workbo
  • 使 np.loadtxt 使用多个可能的分隔符

    我有一个程序可以读取数据文件 用户可以选择他们想要使用的列 我希望它对于输入文件更加通用 有时 列可能如下所示 10 34 24 58 8 284 6 121 有时它们可 能看起来像这样 10 34 24 58 8 284 6 121 我希
  • 如何绘制多类分类器的精度和召回率?

    我正在使用 scikit learn 我想绘制精度和召回曲线 我正在使用的分类器是RandomForestClassifier scikit learn 文档中的所有资源都使用二元分类 另外 我可以绘制多类的 ROC 曲线吗 另外 我只找到
  • 在python中安装scipy模块时出错

    我正在尝试使用 pip 在 python 中安装 scipy 模块 它显示以下错误 Command c users sony appdata local programs python python35 32 python exe u c
  • Python:帮助(numpy)在退出时导致段错误

    我遇到了一个奇怪的现象 在 python 解释器中 我执行以下操作 gt gt gt import numpy gt gt gt help numpy 帮助显示正确 但一旦我按 q 返回解释器 Segmentation fault core
  • 如何限制scrapy请求对象?

    所以我有一个蜘蛛 我认为它正在泄漏内存 结果当我检查 telnet 控制台 gt gt gt prefs 时 它只是从链接丰富的页面中抓取了太多链接 有时它会超过 100 000 个 现在我已经一遍又一遍地浏览文档和谷歌 但我找不到一种方法
  • Matplotlib 中的 TwoSlopeNorm 未按预期工作

    我正在尝试创建一个具有发散颜色图的绘图 该颜色图在零附近不对称 In this https stackoverflow com a 20146989 6288682例如 DivergingNorm函数被使用并产生我想要的 然而 我使用的是更

随机推荐