如何在不使用 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