Это нелегко. Вы можете вызвать двоичный файл 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
для простоты.
Я обнаружил, что могу установить порядок столбцов (в последнюю позицию) в 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)
Чтобы установить порядок столбцов на основании расположения другого столбца (аналогично
blockquote>
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
Также можно изменить порядок столбцов при компиляции 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()
.
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. Может быть, они готовы принять это как запрос об ошибке / функции? По крайней мере, это кажется как незначительная (одна строка), которая не имела бы никакого эффекта, кроме изменения, которое вы просите (что, возможно, тоже лучше).
NotesMixin.notes._creation_order = 9999
– Gary van der Merwe
14 October 2010 в 11:55
_creation_order
, поскольку это намеренный способ EXPLICITLY установить порядок создания столбцов, независимо от того, является ли он FK или нет.
– Devy
16 July 2015 в 15:11