【问题标题】:Why redoing automapping is necessary? (SQLAlchemy)为什么需要重做自动映射? (SQL炼金术)
【发布时间】:2019-02-15 10:34:01
【问题描述】:

我正在尝试理解代码,它大致执行以下操作:

# db.py module

engine = create_engine(DB_URL, pool_timeout=20, pool_recycle=1)

def get_session():
    return scoped_session(sessionmaker(bind=engine, expire_on_commit=False))()

def get_base():
    base = automap_base()
    base.prepare(engine, reflect=True)
    return base

base = get_base()
User = base.classes.user

在某些功能中:

# other.py module
from db import get_base, get_session, User

def some_func():
   sess = get_session()
   # do something with sess and User:
   user = sess.query(User).first()

   User2 = get_base().classes.user
   try:
      check = sess.query(User2).first()
   except:
      sess.rollback()

   # do more with sess
   sess.commit()

some_func 可以在例如 celery 任务中调用,但没有使用 greenlets 或其他类似的猴子补丁并发技巧。

我想知道,通过重新映射元数据可以实现什么?我的理解是否正确,那么由于范围会话 SQLAlchemy 无论如何都会有相同的对象?在这种情况下,甚至会话似乎都是一样的。

重点是什么?

我对获取相同对象的假设是错误的:

(Pdb) pp user
<sqlalchemy.ext.automap.user object at 0x7f62e1a57390>
(Pdb) pp check
<sqlalchemy.ext.automap.user object at 0x7f62e0e93750>
(Pdb) pp user == check
False
(Pdb) pp user.id
1L
(Pdb) pp check.id
1L

id是主键,即唯一)

所以似乎 SQLAlchemy 将来自不同基础的对象分开保存。

到目前为止,我最好的猜测是,这个技巧允许在当前运行的事务之外进行例如用户存在测试。

【问题讨论】:

    标签: python sqlalchemy introspection


    【解决方案1】:

    大多数时候它是不必要的,只会减慢应用程序的速度。数据库模式在应用程序运行时通常不会经常更改,简单的更改应该无关紧要(请参阅"Data independence")。重做反射等只是人们似乎在做的事情——可能是因为害怕使用全局变量。另一方面,在您的示例中,首先似乎在db.py 中反射只进行一次以生成全局baseUser 类。

    这同样适用于范围会话注册表。注册表本身旨在为线程本地会话提供服务,因此一直重新创建它是没有意义的。相反,它应该是一个应用程序范围的单例。应该注意的是,使用范围会话意味着您的应用程序以与其兼容的方式使用线程,或者换句话说,单个线程应该处理单个作业,例如请求/响应等,以便session 自然绑定到线程的生命周期。

    您关于获得相同对象的假设由于基类和模型类的重新创建而中断。尽管它们代表数据库中的同一行,但它们是不同的模型,因此在会话中产生不同的对象。

    【讨论】:

    • 谢谢您-这是非常有用的。我又加上了一句我自己对原因的看法。希望人们能找到这个问答并停止低效的做法。那么重做反思的正当理由是什么?
    • 也许在一些长时间运行的应用程序中,必须在不停止的情况下进行升级,等等。我自己在这方面的经验有限,所以很难想出经常重做反射的用例。这并不是说没有用例。
    猜你喜欢
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2016-09-27
    • 1970-01-01
    • 2019-08-02
    • 2016-12-25
    相关资源
    最近更新 更多