gpt4 book ai didi

mysql - Rails 中的多个数据库连接

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

我正在用 Rails 编写一个更简单的 phpMyAdmin 版本;此 Web 应用程序将在 Web 服务器上运行(用户将能够在其中指示数据库名称、主机名、用户名、密码和在同一网络上运行的其中一个数据库服务器的端口号)。然后用户将连接到该机器,并能够使用 UI 管理该数据库(添加或删除列、删除表等)。

我有两个相关的问题(您的帮助将极大地帮助我理解如何最好地解决这个问题):

  1. 在传统的 Rails 应用程序中,我会将数据库信息存储在 database.yml 中,但在这里我需要动态地进行。有没有一种好方法可以将 database.yml 文件留空,并告诉 Rails 使用用户在运行时提供的连接数据来代替?

  2. 不同的用户可能会连接到不同的数据库(甚至主机)。我假设我需要跟踪已建立的数据库连接和用户 session 之间的关联。实现这一目标的最佳方法是什么?

提前谢谢你。

最佳答案

  1. 要防止 Rails 使用 database.yml 初始化 ActiveRecord,您只需从 config/environment.rb 的 config.frameworks 中删除 :active_record。然后,要手动建立连接,您可以使用 ActiveRecord::Base.establish_connection。 (也许 ActiveRecord::Base.configurations)

    ActiveRecord 将所有与连接相关的内容存储在类变量中。所以如果你想动态创建多个连接,你还必须动态地继承 ActiveRecord::Base 并在其上调用 establish_connection。

    这将是您将用于实际管理表的任何子类的抽象基类。要让 ActiveRecord 意识到这一点,您应该在基类定义中执行 self.abstract_class = true

    然后,您要管理的每个表将依次动态继承这​​个新的抽象基类。

  2. 这比较困难,因为您当然不能真正持久连接。我能想到的直接解决方案是在 session 中存储一个唯一 token ,并在 before_filter 中使用它返回动态 ActiveRecord::Base 子类,您可能会将其存储在某个地方的散列中。

    一旦您开始运行多个 Rails 工作进程,这就会变得更加有趣:

    • 您必须在 session 中存储所有数据库连接信息,以便其他工作人员可以使用它。
    • 您可能希望跨工作人员使用一致的唯一 token ,因此对数据库连接参数的组合使用哈希函数。
    • 因为一个 worker 可能被调用了一个它还不知道的标记,你的子类化和建立连接逻辑可能会发生在 before_filter 中。 (例如,而不是登录时刻。)
    • 您将不得不想出一些巧妙的方法来收集连接和类的垃圾,以便在用户未正确注销和 session 过期时使用。 (抱歉,我不知道这个。)

关于mysql - Rails 中的多个数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2127803/

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