gpt4 book ai didi

mysql - 用户记录保存到一个数据库但不在另一个数据库中

转载 作者:行者123 更新时间:2023-11-29 06:36:47 24 4
gpt4 key购买 nike

我正在使用 Rails 和 MySql 数据库以及 Devise 进行用户注册。我在两个数据库中有一个用户表,例如:db1 和 db2。注册用户后,我检查了 Rails 在后台,为两个数据库创建了用户。当我查看 db1 的用户表时,没有找到记录,但为 db2 插入了记录。

这是我的代码。感谢您的帮助。

user model
-----------
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :confirmation_token

after_create :save_to_db2
def save_to_db2
@user = User.last
ActiveRecord::Base.establish_connection("db_second").connection
sql = "INSERT INTO users (username, email) VALUES ('#{@user.username}', '#{@user.email}')"
connection.execute(sql)
end
end

database.yml
-------------
development:
adapter: mysql2
encoding: utf8
database: db1
pool: 5
username: root
password: root

db_second:
adapter: mysql2
encoding: utf8
database: db2
pool: 5
username: root
password: root

最佳答案

您的方法存在一些问题:

最重要的一点:通过这种方式编写 SQL 语句,您很容易受到 SQL 注入(inject)攻击。参见 this site了解更多信息。请尽量避免构建自己的 SQL,并尽可能使用 ActiveRecord 的辅助方法。

其次,您正在与错误的连接通话。每个请求都有一个数据库连接。通过调用 ActiveRecord::Base.establish_connection("db_second"),您将该连接更改为与“db2”的连接。这意味着之后,所有操作都将使用该连接而不是与“db1”的连接。

这两个问题的可能解决方案是引入具有不同连接的第二个模型。

class BackupUser < ActiveRecord::Base

def self.establish_connection
super(:db_second)
end

establish_connection

end

然后在您的原始用户中:

class User < ActiveRecord::Base

# ....

after_create :make_backup

def make_backup
BackupUser.create!(username: username, email: email)
end

end

但是,如果您使用它进行备份,可能有更好的工具。如果备份是您想要的,您可能需要查找“热备份”解决方案。

关于mysql - 用户记录保存到一个数据库但不在另一个数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24087300/

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