Миграция Rails: измените тип столбца и обновите существующие данные

Метод Socket API

см. https://stackoverflow.com/a/28950776/711085

Недостатки:

  • Не кросс-платформенный.
  • Требуется дополнительный резервный код, привязанный к существованию определенных адресов в Интернете
  • Это также не сработает, если вы за поддержкой NAT
  • Вероятно, создается соединение UDP, не зависящее от доступности DNS (как правило, ISP) (см. другие ответы для таких идей, как использование 8.8.8.8: сервер Google (по совпадению с DNS))
  • Убедитесь, что вы назначили адрес назначения UNREACHABLE, например, числовой IP-адрес, который гарантированно гарантирован. НЕ используйте какой-либо домен, например fakesubdomain.google.com или somefakewebsite.com; вы все равно будете спамить эту сторону (сейчас или в будущем), а также рассылать свои собственные сетевые ящики.

Метод рефлектора

(Обратите внимание, что это не отвечает на вопрос OP о локальном IP-адресе, например 192.168 ..., он дает вам общедоступный IP-адрес, который может быть более желательным в зависимости от варианта использования.)

Вы можете запросить какой-то сайт, например whatismyip.com (но с API), например:

from urllib.request import urlopen
import re
def getPublicIp():
    data = str(urlopen('http://checkip.dyndns.com/').read())
    # data = 'Current IP CheckCurrent IP Address: 65.96.168.198\r\n'

    return re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)

или использовать python2:

from urllib import urlopen
import re
def getPublicIp():
    data = str(urlopen('http://checkip.dyndns.com/').read())
    # data = 'Current IP CheckCurrent IP Address: 65.96.168.198\r\n'

    return re.compile(r'Address: (\d+\.\d+\.\d+\.\d+)').search(data).group(1)

Преимущества:

  • Одним из достоинств этого метода является кросс-платформенный
  • Он работает из-за уродливых NAT (например, вашего домашнего маршрутизатора).

Недостатки (и обходные пути):

  • Требуется, чтобы этот сайт был вверх, формат не менялся (почти наверняка не будет), а ваши DNS-серверы будут работать. Можно устранить эту проблему, также обратившись к другим сторонним отражателям IP-адресов в случае сбоя.
  • Возможный вектор атаки, если вы не запрашиваете несколько отражателей (чтобы предотвратить скомпрометированный отражатель от вас, что ваш адрес это что-то не так), или если вы не используете HTTPS (чтобы предотвратить атаку «человек в середине», претендующий на роль сервера)

изменить : Хотя изначально я думал, что эти методы были очень плохими (если вы не используете много резервных копий, код может быть неактуальным через много лет), он задает вопрос «что такое интернет?». Компьютер может иметь множество интерфейсов, указывающих на множество разных сетей. Для более подробного описания темы google для gateways and routes. Компьютер может иметь доступ к внутренней сети через внутренний шлюз или получить доступ к всемирной сети через шлюз, например, для маршрутизатора (как правило, для случая). Локальный IP-адрес, о котором спрашивает OP, только четко определен в отношении одного уровня связи, поэтому вы должны указать, что («это сетевая карта или кабель Ethernet, о котором мы говорим?») , На этот вопрос может быть несколько неповторимых ответов. Однако глобальный IP-адрес во всемирной сети, вероятно, хорошо определен (в отсутствие массивной фрагментации сети): возможно, путь возврата через шлюз, который может получить доступ к TLD.

0
задан user1066568 21 February 2019 в 04:14
поделиться

1 ответ

Я использую Postgres. Не уверен, работает ли это решение для других баз данных. Таблица people используется в качестве примера - не забудьте изменить имя таблицы на свое.

  def up
    change_column :people, :permanent, 'integer USING CAST(permanent AS integer)'
    Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 0 THEN 1 WHEN 1 THEN 2 END")
  end

  def down
    Person.connection.execute("UPDATE people SET permanent = CASE permanent WHEN 1 THEN 0 WHEN 2 THEN 1 END")
    change_column :people, :permanent, 'boolean USING CAST(permanent AS boolean)'
  end
0
ответ дан Eldar 21 February 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: