我有各种各样类似(但不完全相同)的数据库,并且想使用 SQLAlchemy 作为“标准化”访问的一种方式。数据库可能略有不同,例如在列名上有一个唯一的前缀,或者它们可能差异更大并且缺少列(或者对于旧数据库,缺少整个表)。
我正在寻求帮助的与其说是 SQLAlchemy 问题,不如说是 Python/Organizational 问题。如何设置多个可以在项目中轻松重用的数据库?
我已经阅读了有关 SQLAlchemy session 的信息,但是如果不在每个项目中实例化它们,就看不到使用它们的方法。
我的问题是:如何制作一个模块/包,其中包含许多要在 SQLAlchemy 中使用的数据库模型设置,这些设置可以在另一个 python 项目中轻松导入/使用?
到目前为止,我还不太担心处理丢失的列/表。我可以稍后解决这个问题,但需要牢记这一点,因为我不能对每个数据库使用完全相同的模型。
任何有关此主题的资源、指针或阅读 Material 将不胜感激。提前致谢,如果这已在其他地方得到解答,我很抱歉,搜索未显示任何与此相关的内容。
编辑 :我保留了原始内容,并根据 Paul 的建议添加了更多内容。
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')
会无限好。
编辑2 :我还知道如何在设置模型时绕过数据库/列命名约定中的变体。这不是问题,但我确实提到了它,所以我知道我不能只为多个数据库使用一个模型集。
我希望通过扩展它我不会混淆水域或使这太困惑。感谢您花时间阅读它!
编辑3 : 我已经设法花更多的时间在这上面。我已按以下方式设置项目:
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 的工作方式结合起来(目前还没有)。但我走上了正轨。我想我会为任何可能想知道如何做同样的事情的人更新这个。
对不起,这变得这么长!
干杯!
最佳答案
根据对我最初问题的要求,我进行了第三次编辑并将其作为我的答案。由于我不确定正确的协议(protocol),我将第三个编辑留在了上面。如果您已经阅读了 EDIT3,那么您已经阅读了我的答案。
我已经设法在这上面多花一点时间。我已按以下方式设置项目:
Databases
__init__.py
databases.py
settings.py
DB1
__init__.py
models.py
...
DB3
__init__.py
models.py
目前,我在 settings.py 文件中“安装”了一个数据库元组。每个 DB 条目都在
INSTALLED_DATABASES = ('DB1', ..., 'DB3')
中指定.随着我完成更多模型,它们被添加到元组列表中。这允许我随时添加或删除内容。我在
models.py
中设置了引擎和 session 文件,并有 __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 的工作方式结合起来(目前还没有)。但我走上了正轨。我想我会为任何可能想知道如何做同样的事情的人更新这个。
对不起,这变得这么长!
干杯!
关于python - SQLAlchemy 和多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15275799/