Flask SQLAlchemy модели mixins - порядок полей в миграции [дубликат]

Это нелегко. Вы можете вызвать двоичный файл php-cgi и передать поддельный запрос POST. Но вам нужно будет настроить множество переменных среды CGI:

  echo  'var1 = 123 & amp; var2 = abc' |  REQUEST_METHOD = POST SCRIPT_FILENAME = script.php REDIRECT_STATUS = CGI CONTENT_TYPE = application / www-form-urlencoded php-cgi  

Примечание: Недостаточно, не работает так. Но что-то в этом роде ...


Это, конечно, проще, если вы просто исправите скрипт и загрузите массив $ _POST из предопределенной переменной среды.

  $ _ POST = parse_url ($ _ SERVER ["_ POST"]);   

Тогда вы можете вызвать его как _POST = var = 123 php script.php для простоты.

16
задан Gary van der Merwe 13 October 2010 в 14:03
поделиться

3 ответа

Я обнаружил, что могу установить порядок столбцов (в последнюю позицию) в Mixin, используя:

@declared_attr
def notes(cls):
    col = sa.Column(sa.String(4000) , nullable=False, default='')
    # get highest column order of all Column objects of this class.
    last_position = max([value._creation_order
            for key, value in vars(cls).items()
            if isinstance(value, Column)])
    col._creation_order = last_position + 0.5
    return col

class Service(Base, NotesMixin):
    __tablename__ =  "service"
    service_id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.String(255), nullable=False, index=True, unique=True)

Чтобы установить порядок столбцов на основании расположения другого столбца (аналогично

alter table `some_table` modify `some_colum` `some_type` after `some_other_column;

см. https://stackoverflow.com/a/3822219/488331 )

Вы можете использовать:

@declared_attr
def notes(cls):
    col = sa.Column(sa.String(4000) , nullable=False, default='')
    col._creation_order = cls.some_other_column._creation_order + 0.5
    return col

ПРИМЕЧАНИЕ. Если вы используете + 1, вы получите 2 столбца назад. Я действительно не понимаю, почему вы даже можете использовать десятичное число.

Чтобы установить порядок столбцов, основанный на местоположении первого столбца (сделайте это всегда 4-й столбец), вы можете сделать:

@declared_attr
def notes(cls):
    col = sa.Column(sa.String(4000) , nullable=False, default='')
    # get lowest column order of all Column objects of this class.
    start_position = min([value._creation_order
            for key, value in vars(cls).items()
            if isinstance(value, Column)])
    col._creation_order = start_position + 3.5
    return col
0
ответ дан Marlen T. B. 17 August 2018 в 09:30
поделиться

Также можно изменить порядок столбцов при компиляции CREATE TABLE (здесь показано на диалекте postgresql):

from sqlalchemy.schema import CreateTable
from sqlalchemy.ext.compiler import compiles


@compiles(CreateTable, 'postgresql')
def _compile_create_table(element, compiler, **kwargs):
    element.columns = element.columns[::-1]   # reverse order of columns
    return compiler.visit_create_table(element)

Затем это работает с metadata.create_all().

2
ответ дан mdh 17 August 2018 в 09:30
поделиться
  • 1
    Я использовал вариант этого: добавьте «упорядочение», для каждого столбца (т. е. Column(..., info={'ordering': 0})) и сортировки element.columns с использованием этого ключа (например, element.columns = sorted(element.columns, key=lambda c: c.element.info.get('ordering')) в сборке таблицы создания. – jadkik94 5 October 2017 в 20:09

Легкий ответ: просто создайте таблицы базы данных самостоятельно, вместо того, чтобы sqlalchemy делать это с помощью metadata.create_all().

Если вы не считаете это приемлемым, я боюсь, что для него потребуется небольшое изменение в sqlalchemy.ext.declarative, или вам придется создать свой собственный метакласс и передать его на declarative_base() с аргументом ключевого слова metaclass. Этот класс будет использоваться вместо стандартного DeclarativeMeta.

Объяснение: sqlalchemy использует порядок создания свойств столбца, который он хранит в «приватном» атрибуте ._creation_order (генерируется, когда Column ( ) называется). Декларативное расширение смешивает столбцы, создавая копию объекта столбца из вашего класса mixin и добавляя его в класс. ._creation_order этой копии устанавливается на то же значение, что и исходное свойство класса mixin. Поскольку класс mixin, конечно, сначала создан, свойства столбца будут иметь более низкий порядок создания, чем подкласс.

Итак, чтобы сделать ваш запрос возможным, при создании копии следует назначить новый порядок создания, а не брать оригинал. Вы можете попробовать создать свой метакласс на основе этого объяснения и использовать его. Но вы также можете попробовать и спросить разработчиков sqlalchemy. Может быть, они готовы принять это как запрос об ошибке / функции? По крайней мере, это кажется как незначительная (одна строка), которая не имела бы никакого эффекта, кроме изменения, которое вы просите (что, возможно, тоже лучше).

5
ответ дан Steven 17 August 2018 в 09:30
поделиться
  • 1
    Благодарю. Используя эту информацию, я сделал: NotesMixin.notes._creation_order = 9999 – Gary van der Merwe 14 October 2010 в 11:55
  • 2
    Я определенно предпочел более чистое решение, поскольку оно уже встроено в sqlalchemy. Я замечаю, что порядок, в котором вы наследуете mixin, имеет значение, если у вас несколько декларативных базовых миксинов. Этого можно ожидать, я полагаю. – Thomas Farvour 29 January 2014 в 23:17
  • 3
    Красивое решение, спасибо! – sleepycal 23 July 2014 в 21:14
  • 4
    Хотя для этого требуется меньше кода, но он чувствует себя немного круговым, поскольку он использует «взломать». путь, то есть неинтерактивный побочный эффект ограничения внешнего ключа для обеспечения упорядочения. Я предпочитаю решение _creation_order, поскольку это намеренный способ EXPLICITLY установить порядок создания столбцов, независимо от того, является ли он FK или нет. – Devy 16 July 2015 в 15:11
  • 5
    Несмотря на то, что с меньшим количеством голосов, это должно быть «правильно». так как он EXPLICITLY задает порядок создания столбцов точно так же, как и запрос OP, независимо от того, является ли столбец FK или нет. – Devy 16 July 2015 в 15:13
  • 6
    Где вы помещаете NotesMixin.notes._creation_order = 9999? В Mixin или в подклассе? Или где-то еще? – Marlen T. B. 8 February 2018 в 21:49
Другие вопросы по тегам:

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