如何在不使用Elixir中的架构的情况下从不同的表中删除注册表

问题描述

我正在尝试从某些表中删除一个寄存器,这些表都与自Elixir以来的同一用户ID有关,但使用的是外部sql Server数据库。我想按特定顺序删除表,但不使用架构。我要执行这些SQL查询

    Table.1 -
    ---------------------------------------------------------------------------
    fake_id     attribute_1     event_time
    ---------------------------------------------------------------------------
    1           attr_val_11     2020-08-01 05:00:00
    2           attr_val_12     2020-08-01 15:00:00 
    3           attr_val_31     2020-08-03 07:00:00
    4           attr_val_41     2020-08-01 05:00:00
    
    Table.2 -
    
---------------------------------------------------------------------------
fake_id     start_time              end_time                updated_time
---------------------------------------------------------------------------
1           2020-08-01 02:00:00     2020-08-01 08:00:00     2020-08-01 00:00:00
2           2020-08-01 04:00:00     2020-08-01 23:00:00     2020-08-01 00:00:00 
3           2020-08-03 02:00:00     2020-08-03 08:00:00     2020-08-03 08:00:00
3           2020-08-03 05:00:00     2020-08-03 10:00:00     2020-08-03 12:00:00
3           2020-08-04 05:00:00     2020-08-04 10:00:00     2020-08-04 12:00:00
4           2020-08-01 08:00:00     2020-08-01 18:00:00     2020-08-01 18:00:00
4           2020-08-01 02:00:00     2020-08-01 05:00:00     2020-08-01 22:00:00



Result :

----------------------------------------------------------------------------------------------
fake_id     attribute_1     event_time              start_time          end_time    
----------------------------------------------------------------------------------------------
1           attr_val_11     2020-08-01 05:00:00     2020-08-01 02:00:00     2020-08-01 08:00:00 
2           attr_val_12     2020-08-01 15:00:00     2020-08-01 04:00:00     2020-08-01 23:00:00
3           attr_val_31     2020-08-03 07:00:00     2020-08-03 05:00:00     2020-08-03 10:00:00
4           attr_val_41     2020-08-01 05:00:00     2020-08-01 02:00:00     2020-08-01 05:00:00

但是我不想将未使用的架构添加到Elixir保护中。我正在尝试做这样的事情:

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'

但是只有我可以将查询翻译为sql

def delete_user_by_user_number(user_id) do
    query = """
    DELETE UsersConfig WHERE UserId = $1
    DELETE UserBranch WHERE UserId = $1
    DECLARE @userCompanyPreferencesId uniqueidentifier
    SELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId = $1
    DELETE UserCompany WHERE UserId = $1
    DELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId
    DELETE Users WHERE UserId = $1
    """

    Ecto.Adapters.sql.stream(UsersRepo,query,[user_id])
  end

您能帮我一些想法做类似的事情吗?

解决方法

什么也没发生是因为您正在使用Ecto.Adapters.SQL.stream。此函数从查询中创建一个惰性结果流,在您开始使用该流之前,实际上不会发生任何事情。我不会将它用于仅需要其副作用的查询(例如删除),而应使用Ecto.Adapters.SQL.query!。也许像这样:

queries = [
  "DELETE UsersConfig WHERE UserId = $1","DELETE UserBranch WHERE UserId = $1","DECLARE @userCompanyPreferencesId uniqueidentifier","SELECT @userCompanyPreferencesId = UserCompanyPreferencesId FROM UserCompany WHERE UserId = $1","DELETE UserCompany WHERE UserId = $1","DELETE UserCompanyPreferences WHERE UserCompanyPreferencesId = @userCompanyPreferencesId","DELETE Users WHERE UserId = $1"
]

for query <- queries do
  Ecto.Adapters.SQL.query!(UsersRepo,query,[user_id])
end