如何在不使用 Elixir 模式的情况下从不同的表中删除注册表
How can I delete registries from different tables without using schema in Elixir
我正在尝试从一些表中删除一个寄存器,所有表都与自 Elixir 以来的相同用户 ID 相关,但使用的是外部 SQL 服务器数据库。我想按特定顺序删除表但不使用 Schema。我想执行这些 SQL 个查询
SELECT *
FROM UsersConfig
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
SELECT *
FROM UserBranch
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
DECLARE @userCompanyPreferencesId uniqueidentifier
SELECT @userCompanyPreferencesId = UserCompanyPreferencesId
FROM UserCompany
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
SELECT *
FROM UserCompany
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
SELECT *
FROM UserCompanyPreferences
WHERE UserCompanyPreferencesId = @userCompanyPreferencesId
SELECT *
FROM Users
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
但我不想将未使用的模式添加到 elixir protect。我正在尝试做这样的事情:
def delete_user_by_user_number(user_id) do
query = """
DELETE UsersConfig WHERE UserId =
DELETE UserBranch WHERE UserId =
DECLARE @userCompanyPreferencesId uniqueidentifier
SELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId =
DELETE UserCompany WHERE UserId =
DELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId
DELETE Users WHERE UserId =
"""
Ecto.Adapters.SQL.stream(UsersRepo, query, [user_id])
end
但只有我将查询翻译成 SQL
%Ecto.Adapters.SQL.Stream{
meta: %{
cache: #Reference<0.3298680420.2890006536.27915>,
opts: [timeout: 15000, pool_size: 2, pool:
m DBConnection.ConnectionPool],
pid: #PID<0.749.0>,
repo: ChainUtils.UsersRepo,
sql: Ecto.Adapters.Tds.Connection,
telemetry: {ChainUtils.UsersRepo, :debug,
[:chain_utils, :users_repo, :query]
}
},
opts: [],
params: ["D9960E26-3F7F-4F8C-954A-FF6316D7A3B3"],
statement: "DELETE UsersConfig WHERE UserId = \nDELETE UserBranch WHERE UserId = \nDECLARE @userCompanyPreferencesId uniqueidentifier
\nSELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId = \nDELETE UserCompany WHERE UserId = \nDELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId\nDELETE Users WHERE UserId = \n"
}
你能帮我出点主意做这样的事情吗?
没有任何反应的原因是您正在使用 Ecto.Adapters.SQL.stream
。此函数从您的查询中创建一个惰性结果流,并且在您开始使用该流之前实际上不会发生任何事情。我不会将它用于只需要其 side-effects 的查询,例如删除 - 而是使用 Ecto.Adapters.SQL.query!
。可能是这样的:
queries = [
"DELETE UsersConfig WHERE UserId = ",
"DELETE UserBranch WHERE UserId = ",
"DECLARE @userCompanyPreferencesId uniqueidentifier",
"SELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId = ",
"DELETE UserCompany WHERE UserId = ",
"DELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId",
"DELETE Users WHERE UserId = "
]
for query <- queries do
Ecto.Adapters.SQL.query!(UsersRepo, query, [user_id])
end
我正在尝试从一些表中删除一个寄存器,所有表都与自 Elixir 以来的相同用户 ID 相关,但使用的是外部 SQL 服务器数据库。我想按特定顺序删除表但不使用 Schema。我想执行这些 SQL 个查询
SELECT *
FROM UsersConfig
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
SELECT *
FROM UserBranch
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
DECLARE @userCompanyPreferencesId uniqueidentifier
SELECT @userCompanyPreferencesId = UserCompanyPreferencesId
FROM UserCompany
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
SELECT *
FROM UserCompany
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
SELECT *
FROM UserCompanyPreferences
WHERE UserCompanyPreferencesId = @userCompanyPreferencesId
SELECT *
FROM Users
WHERE UserId = 'D9960E26-3F7F-4F8C-954A-FF6316D7A3B3'
但我不想将未使用的模式添加到 elixir protect。我正在尝试做这样的事情:
def delete_user_by_user_number(user_id) do
query = """
DELETE UsersConfig WHERE UserId =
DELETE UserBranch WHERE UserId =
DECLARE @userCompanyPreferencesId uniqueidentifier
SELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId =
DELETE UserCompany WHERE UserId =
DELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId
DELETE Users WHERE UserId =
"""
Ecto.Adapters.SQL.stream(UsersRepo, query, [user_id])
end
但只有我将查询翻译成 SQL
%Ecto.Adapters.SQL.Stream{
meta: %{
cache: #Reference<0.3298680420.2890006536.27915>,
opts: [timeout: 15000, pool_size: 2, pool:
m DBConnection.ConnectionPool],
pid: #PID<0.749.0>,
repo: ChainUtils.UsersRepo,
sql: Ecto.Adapters.Tds.Connection,
telemetry: {ChainUtils.UsersRepo, :debug,
[:chain_utils, :users_repo, :query]
}
},
opts: [],
params: ["D9960E26-3F7F-4F8C-954A-FF6316D7A3B3"],
statement: "DELETE UsersConfig WHERE UserId = \nDELETE UserBranch WHERE UserId = \nDECLARE @userCompanyPreferencesId uniqueidentifier
\nSELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId = \nDELETE UserCompany WHERE UserId = \nDELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId\nDELETE Users WHERE UserId = \n"
}
你能帮我出点主意做这样的事情吗?
没有任何反应的原因是您正在使用 Ecto.Adapters.SQL.stream
。此函数从您的查询中创建一个惰性结果流,并且在您开始使用该流之前实际上不会发生任何事情。我不会将它用于只需要其 side-effects 的查询,例如删除 - 而是使用 Ecto.Adapters.SQL.query!
。可能是这样的:
queries = [
"DELETE UsersConfig WHERE UserId = ",
"DELETE UserBranch WHERE UserId = ",
"DECLARE @userCompanyPreferencesId uniqueidentifier",
"SELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId = ",
"DELETE UserCompany WHERE UserId = ",
"DELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId",
"DELETE Users WHERE UserId = "
]
for query <- queries do
Ecto.Adapters.SQL.query!(UsersRepo, query, [user_id])
end