ミドルりェアの恐怖ず嫌悪

phpが私たちを克服したずき、私たちはJavaScriptの近くにいたした。 次のようなこずを蚀ったこずを芚えおいたす。私の頭が回転しおいたす。 たぶんあなたはプロゞェクトを持っおいる方が良いでしょう。







突然、私たちの呚りにひどいブヌムがありたした...そしお、りェブ党䜓がLAMPに関するこれらの蚘事でいっぱいでした...

どんなニヌズにも察応できるように曞かれおいるようです。 perl、bash、さらにはCでさえ䜿甚しおいたタスクを成長させ、吞収したしたが、これらの蚘事に぀いお話す意味はありたせん。 誰もがすでにそれを知っおいたす。



5番目のIE、少しのNetscape、Opera、およびperlの雑倚なcgiモゞュヌルがありたした。 必芁な技術スタックではなかった。 しかし、もしあなたがナンセンスを集め始めたら、止めるのは難しくなりたす。 私が心配しおいたのはPHPを䜿甚しおいる孊生だけでした 。 これほど無力で無責任で甘やかされおいるものはありたせん。 遅かれ早かれ、このゎミに進むこずを知っおいたした。



最初はそうではなかった



ブラりザ間のJSがコルクの銬のように異なり、XMLHttpRequestはActiveXを介しおのみ可胜でした。 あたり道はありたせんでした。 ダむナミックWebを削枛したもの。 IE 6は革呜のように芋えたした。 しかし、クロスプラットフォヌムが必芁な堎合は、膚倧なミドルりェアをパスしたした。 php、ツヌル、および関連する新しいラむブラリに関する倚数の蚘事がその圹目を果たしたした。



ひどいPHPで、叀いアむルランドの小説に酔った囜、基本的な運動機胜の完党な喪倱、芖界のがやけ、朚補の舌、恐怖の脳のように振る舞いたす。 すべおを芋るこずができるが、䜕も制埡するこずができない面癜い状態。 デヌタがどこにあり、どこにロゞックがあり、どこに衚珟があるかを明確に把握しお、タスクにアプロヌチしたす。 しかし、その堎で、すべおが間違っおいたす。 あなたは邪悪な麺のコヌドに混乱しおいお、あなたは思う䜕が問題なのか、䜕が起こっおいるのか...



埐々に、ブラりザ間のタむタニックプレヌトが収束し始めたした。 XMLHttpRequestはどこにでも登堎し、フロントが明確に分離された動的なWEBの倢が珟実になりたした。



もちろん、私は流行の犠牲になりたした。 手に入れたものすべおを研究した普通のストリヌトロヌファヌ。 Web開発甚の単䞀蚀語に぀いおのアむデアが空䞭にありたした。 埅っお、あなたは新しい装いでこれらの倉化を芋るでしょう、男。

-Node.jsを芋おみたしょう。

-䜕 いや

「ここで止めるこずはできたせん。」 これは倪った䞭間です。

-座っお。

どのようなナンセンスがねじれおいたすか。フロント゚ンド、ミドル゚ンド、バック゚ンドの類䌌性を芋぀けるためにJavaScriptでどれだけ曞く必芁があるのか​​わかりたせんか これは良い遞択肢ではありたせん。 遞択したタヌゲットには厚すぎたす。





しかし、私はそのような考えを残したした。 ドラむバヌで釘を打぀こずができるこずを理解するようになりたしたが、時々ハンマヌに手を差し䌞べるず、プロセスが倧幅に加速したす。



私は党䜓の状況に察しお恐ろしい抗議を感じたした。



PostgreSQLなどのDBMSがあり、組み蟌み関数を䜿甚しお信じられないほどデヌタを操䜜できたす。 ベヌス内のビゞネスロゞック 実際のバック゚ンド。 DBMSのビゞネスロゞックが気に入らず、そこに属しおいたせんか このような盎接デヌタストリヌムが奜きですか





喫煙者の「盎接的な」流れに関するデヌタの厄介な動きを把握しおみたしょう。



最初に遭遇するのは、䜕らかの理由でデヌタが途䞭で絶えず蒞留されるこずです。 さらに、このデヌタは最終的なものではなく、埌続のリク゚ストの蚈算にのみ必芁です。 デヌタ凊理にはサむクルが䜿甚されたす。 手続きサむクル-マルチスレッド甚に最適化されおいたせん。



DBMSぞの1぀のセッションでのク゚リの倚様性は、速床の終miseずいう避けられない仮説に぀ながりたす-デヌタベヌステヌブルのマルチパス。







これらの芁因を排陀するには、ロゞックをデヌタに近づける必芁がありたす。 DBMSで

そしお、これは速床を新しい䟡倀にもたらす最も最適な方法です



アむデアの圢成



時間の経過ずずもに、ブラりザはむンタヌフェむスの完党な動的生成を孊習したした。 デヌタずプレれンテヌションの面で明確な分離が達成されたした。 䞻にサヌバヌからクラむアントにデヌタを送信する本栌的な機䌚がありたした。 質問は1぀だけでした。䞭間局で䜕をするかです。 サヌバヌ偎でコレクションのリク゚ストを単玔にルヌティングする芁玠を䜿甚しお、トランスポヌト機胜のみにそれを最小化する方法。



これらの玠朎な開発者は、叀いミドルの拠点の1぀を研究するこずで、安心ず理解が埗られるず信じおいたした。その結果、IT業界の䞻芁な、叀い䞖界の間違いを理解しおいなかった厚いレむダヌが生成されたした。 誰かたたは䜕かが臎呜的な欠陥を持っおいるかもしれないずいう信念を倱いたす。

その時たでに、nginxは機胜し始め、提案された思考を準備するための質問はもうありたせんでした。 それはもはや考えではありたせんでした。 今では怠programmerなプログラマヌコンテストでした。 apacheを介しお䌝統的な方法でアヌキテクチャを䜕らかの圢で説明しようずするずいうアむデア自䜓は、ばかげおいるように芋えたした。



2010幎に、 ngx_postgresモゞュヌルがgithubに到着したした。 蚭定ファむルでリク゚ストを指定し、JSON / CSV / WELLで発行したす。

構成には、単玔なSQLコヌドで十分でした。 耇合䜓を関数にラップし、構成から呌び出すこずができたす。



しかし、このモゞュヌルは、http芁求の本文をDBMSにロヌドできたせんでした。 サヌバヌに送信されるデヌタに重倧な制限が課されたした。 URLは明らかに、リク゚ストのフィルタリングにのみ適しおいたした。

出力デヌタのシリアル化は、モゞュヌル自䜓を䜿甚しお実行されたした。 それは、私の゜ファの高さから、RAMの無意味な翻蚳のように思えた-PostgreSQLもシリアラむズできた。

修正、曞き換えるずいうアむデアがありたした。 私はこのモゞュヌルのコヌドを掘り始めたした。



眠れぬ倜を探した埌、ngx_postgresは倚くの人にずっお十分でしょう。 もっず匷力なものが必芁でした。

マダム、サヌ、ベむビヌ、その他䜕でも ... ... ngx_pgcopyを保持するオプションがありたす。







NGX_PGCOPY



実隓の実隓ず分析の分析の埌、実甚的なすべおをれロから曞き盎すずいうアむデアが生たれたした。 ロヌドを高速化するために、 COPYク゚リが遞択されたした。これは、挿入よりも1桁高速にデヌタをデヌタベヌスに転送し、独自のパヌサヌを含みたす。 残念ながら、このタむプのク゚リの蚘述が䞍足しおいるため、このメ゜ッドの特に倧芏暡な呌び出し䞭にDBMSがどのように実行するかを蚀うのは困難です。



䞖界はあらゆる方向に狂っおいお、い぀でもあなたは絶えずそれに出くわしたす。 しかし、私たちがしたすべおのこずの正確さに぀いお、驚くほど普遍的な感芚がありたした。



COPYリク゚ストず䞀緒に、CSVで双方向のシリアル化を自動的に受信したため、デヌタ倉換の懞念がなくなりたした。



URLでCSVのテヌブル党䜓を送受信するプリミティブから始めたしょう。

http://some.server/csv/some_table







CSVパヌツimport.export.nginx.conf



 pgcopy_server db_pub "host=127.0.0.1 dbname=testdb user=testuser password=123"; location ~/csv/(?<table>[0-9A-Za-z_]+) { pgcopy_query PUT db_pub "COPY $table FROM STDIN WITH DELIMITER as ';' null as '';"; pgcopy_query GET db_pub "COPY $table TO STDOUT WITH DELIMITER ';';"; }
      
      









PostgreSQLは珟圚、COPY STDINを介しおJSONおよびXMLを䜜成できたせん。 象のコヌドスタむルのタブを䜿甚した謙虚な日が来お、私、たたは誰かのスレッドが時間を芋぀けお、この機胜をCOPYメ゜ッドにねじ蟌んでくれるこずを願っおいたす。 さらに、これらの圢匏の凊理はすでにDBMSに存圚したす。



しかし ここでも今でもそれを䜿甚する方法がありたす 次にリク゚ストで倉数$ request_body_fileを䜿甚しおpg_read_binary_file関数に枡すこずで、nginxをclient_body_in_file_onlyに蚭定したす...

もちろん、次のようにCOPYメ゜ッドでこれをラップする必芁がありたす ngx_postgresのbody_rejectaが完党であるため、モペットでのみ機胜したす。 私はただ他のモペットに䌚っおいないし、ngx_pgcopyは远加機胜のためにただ成熟しおいない。



import.export.nginx.confでjson / xmlがどのように芋えるか芋おみたしょう



 client_body_in_file_only on; client_body_temp_path /var/lib/postgresql/9.6/main/import; location ~/json/(?<table>[0-9A-Za-z_]+) { pgcopy_query PUT db_pub "COPY (SELECT * FROM import_json_to_simple_data('$request_body_file')) TO STDOUT;"; pgcopy_query GET db_pub "COPY (SELECT '['||array_to_string(array_agg(row_to_json(simple_data)), ',')||']' FROM simple_data) TO STDOUT;"; } location ~/xml/(?<table>[0-9A-Za-z_]+) { pgcopy_query PUT db_pub "COPY (SELECT import_xml_to_simple_data('$request_body_file') TO STDOUT;"; pgcopy_query GET db_pub "COPY (SELECT table_to_xml('$table', false, false, '')) TO STDOUT;"; }
      
      





はい、client_body_temp_pathをデヌタベヌスディレクトリに蚭定する必芁があり、ナヌザヌにはALTER SUPERUSERを䞎える必芁がありたす。 そうでなければ、Postgresは私たちの欲望を地平線を越​​えお送りたす。

GETメ゜ッドで提䟛される゚クスポヌトは、暙準のPostgresパッケヌゞに含たれおいる組み蟌み関数を䜿甚したす。 これらのアクションの結果をクラむアントに通知する堎合に備えお、すべおのCOPYがSTDOUTに衚瀺されたす。 固定テヌブルsimple_dataぞのむンポヌトぱクスポヌトよりも少し倧きく芋えるため、ナヌザヌ定矩のDBMSプロシヌゞャで削陀されたす。



固定テヌブルぞのむンポヌト甚の1.import.export.sqlの䞀郚



 CREATE OR REPLACE FUNCTION import_json_to_simple_data(filename TEXT) RETURNS void AS $$ BEGIN INSERT INTO simple_data SELECT * FROM json_populate_recordset(null::simple_data, convert_from(pg_read_binary_file(filename), 'UTF-8')::json); END; $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION import_xml_to_simple_data(filename TEXT) RETURNS void AS $$ BEGIN INSERT INTO simple_data SELECT (xpath('//s_id/text()', myTempTable.myXmlColumn))[1]::text::integer AS s_id, (xpath('//data0/text()', myTempTable.myXmlColumn))[1]::text AS data0 FROM unnest(xpath('/*/*', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(filename), 'UTF-8')))) AS myTempTable(myXmlColumn); END; $$ LANGUAGE plpgsql;
      
      





JSONの柔軟なテヌブル遞択を䜿甚したむンポヌト機胜は、䞊蚘ず特に違いはありたせん。 しかし、XMLのこのような柔軟性により、より倧きな共有が生成されたす。

任意のテヌブルにむンポヌトするための1.import.export.sqlの䞀郚
 CREATE OR REPLACE FUNCTION import_vt_json(filename TEXT, target_table TEXT) RETURNS void AS $$ BEGIN EXECUTE format( 'INSERT INTO %I SELECT * FROM json_populate_recordset(null::%I, convert_from(pg_read_binary_file(%L), ''UTF-8'')::json)', target_table, target_table, filename); END; $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION import_vt_xml(filename TEXT, target_table TEXT) RETURNS void AS $$ DECLARE columns_name TEXT; BEGIN columns_name := ( WITH xml_file AS ( SELECT * FROM unnest(xpath( '/*/*', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(filename), 'UTF-8')))) --read tags from file ), columns_name AS ( SELECT DISTINCT ( xpath('name()', unnest(xpath('//*/*', myTempTable.myXmlColumn))))[1]::text AS cn FROM xml_file AS myTempTable(myXmlColumn) --get target table cols name and type ), target_table_cols AS ( -- SELECT a.attname, t.typname, a.attnum, cn.cn FROM pg_attribute a LEFT JOIN pg_class c ON c.oid = a.attrelid LEFT JOIN pg_type t ON t.oid = a.atttypid LEFT JOIN columns_name AS cn ON cn.cn=a.attname WHERE a.attnum > 0 AND c.relname = target_table --'log_data' ORDER BY a.attnum --prepare cols to output from xpath ), xpath_type_str AS ( SELECT CASE WHEN ttca.cn IS NULL THEN 'NULL AS '||ttca.attname ELSE '((xpath(''/*/'||attname||'/text()'', myTempTable.myXmlColumn))[1]::text)::' ||typname||' AS '||attname END AS xsc FROM target_table_cols AS ttca ) SELECT array_to_string(array_agg(xsc), ',') FROM xpath_type_str ); EXECUTE format('INSERT INTO %s SELECT %s FROM unnest(xpath( ''/*/*'', XMLPARSE(DOCUMENT convert_from(pg_read_binary_file(%L), ''UTF-8'')))) AS myTempTable(myXmlColumn)', target_table, columns_name, filename); END; $$ LANGUAGE plpgsql;
      
      







䞊蚘の䟋では、むンポヌトされたファむルの名前table_nameは、nginxで指定されたタヌゲット宛先テヌブルに圱響したせん。 table_name / rows / colsドキュメントのxml階局の䜿甚は、組み蟌みのtable_to_xml関数ずの察称性のみに起因したす。



デヌタセット自䜓...

simple_data_table.sql
 CREATE TABLE simple_data ( s_id SERIAL, data0 TEXT );
      
      





data.csv
0;zero

1;one







data.json
 [ {"s_id": 5, "data0": "five"}, {"s_id": 6, "data0": "six"} ]
      
      





data.xml
 <simple_data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <s_id>3</s_id> <data0>three</data0> </row> <row> <s_id>4</s_id> <data0>four</data0> </row> </simple_data>
      
      





ここに移動したので、玔粋なCOPYのルヌツに戻りたす...



わかった これがおそらく唯䞀の方法です。 すべおを正しく理解したこずを確認したしょう。 サヌバヌずクラむアント間で凊理せずにデヌタを送信し、それらをテヌブルに入力したすか







私は恐怖を感じたず思いたす。

ナンセンス。 ミドルりェアの倢を芋぀けに来たした。

そしお今、私たちは圌女の旋颚の䞭にいるので、あなたは去りたいですか

あなたは理解する必芁がありたす、私たちは䞻な神経を芋぀けたした。





はい、それはほずんどそのようなものです これはCRUDの拒吊です。

もちろん、いく぀かの文のあるタむプがカリフォルニアの心の仕事の結果を消し、麻薬䞭毒者の察話のための短い蚘事を様匏化するので、倚くはmanyりたす。 ただし、すべおが倱われるわけではありたせん。 デヌタ自䜓ずずもにデヌタ修食子を枡すオプションがありたす。 それは今でもおなじみのRESTfulアヌキテクチャから離れおいたす。



さらに、時には、そしおより頻繁に、理論的研究が珟実の岩石に䟵入したす。 そのような岩は同じ䞍幞なマルチパスです。 実際、ナヌザヌドキュメントの倚数の䜍眮の倉曎を蚱可する堎合、これらの倉曎にはいく぀かのタむプのメ゜ッドが含たれる可胜性がありたす。 その結果、1぀のドキュメントをデヌタベヌスに送信するには、いく぀かの個別のhttp芁求を䜜成する必芁がありたす。 たた、各HTTPリク゚ストは、独自のベヌス倉曎ずテヌブルの通過を生成したす。 したがっお、定性的なブレヌクスルヌには、CRUDメ゜ッドの叀兞的な理解を攟棄する際の根本的な倉曎が必芁です。 進歩には犠牲が必芁です。



ここで、より興味深い解決策が芋぀かるず疑っおいたした。 あなたはちょっず実隓しお考える必芁がありたす...



゚ントリヌポむント



この質問をする頃には、

圌に答えるこずができる人はただ近くにいたせんでした。

はい、はい、私は再び始めおいたす...



䞭間局にデヌタを送信し、䞭間局は凊理せずにデヌタベヌスに送信したす。

DBMSはそれらを解析し、ログ/ログずしお機胜するテヌブルに配眮したす。 すべおの入力デヌタの登録。



重芁な瞬間、ここにありたす ロギング/ロギングデヌタの流れはそのたたで そしお、それはトリガヌ次第です。 それらでは、ビゞネスロゞックに基づいお、曎新、远加、たたは他の䜕かを行いたす。 デヌタ修食子のねじ蟌みはオプションですが、玠晎らしいボヌナスになる堎合がありたす。



これにより、HTTP GETメ゜ッドずPUTメ゜ッドを䜿甚するこずで十分になりたす。 それを適甚する方法をシミュレヌトしおみたしょう。 たず、ログずログの違いを刀断したす。 倉曎のルヌトの倀ず最終倀の間の優先順䜍による重芁な違いを匷調したす。 最初の基準をログに割り圓お、2番目の基準をログに割り圓おたす。



雑誌の最終目暙の優先順䜍にもかかわらず、ルヌトはただ必芁です。 その結果、このようなテヌブルは、結果ずゞャヌナル自䜓の2぀の郚分に分割されたす。







䜕を匕き出すこずができたすか ログ車のルヌト、移動する玠材資産など ログ圚庫残高、最埌のコメント、およびその他の最近のむンスタントデヌタの状態。



2.jrl.log.sqlのコヌド



テヌブル
 CREATE TABLE rst_data ( --Output/result table 1/2 s_id SERIAL, data0 TEXT, --Operating Data data1 TEXT, --Operating Data ); --Service variable with prefix s_, ingoring input value, it will be setting from trigers CREATE TABLE jrl_data ( --Input/journal table 2/2 s_id SERIAL, --Service variable, Current ID of record s_cusr TEXT, --Service variable, User name who created the record s_tmc TEXT, --Service variable, Time when the record was created p_trid INTEGER, --Service variable, Target ID/Parent in RST_(result) table, -- if exists for modification data0 TEXT, data1 TEXT, ); CREATE TABLE log_data ( --Input/output log table 1/1 s_id SERIAL, s_cusr TEXT, s_tmc TEXT, pc_trid INTEGER, --Service variable, Target ID(ParentIN/ChilrdenSAVE) -- in CURRENT table, if exists for modification data0 TEXT, data1 TEXT, );
      
      





マガゞントリガヌ
 CREATE OR REPLACE FUNCTION trg_4_jrl() RETURNS trigger AS $$ DECLARE update_result INTEGER := NULL; target_tb TEXT :='rst_'||substring(TG_TABLE_NAME from 5); BEGIN --key::text,value::text DROP TABLE IF EXISTS not_null_values; CREATE TEMP TABLE not_null_values AS SELECT key,value from each(hstore(NEW)) AS tmp0 INNER JOIN information_schema.columns ON information_schema.columns.column_name=tmp0.key WHERE tmp0.key NOT LIKE 's_%' AND tmp0.key <> 'p_trid' AND tmp0.value IS NOT NULL AND information_schema.columns.table_schema = TG_TABLE_SCHEMA AND information_schema.columns.table_name = TG_TABLE_NAME; IF NEW.p_trid IS NOT NULL THEN EXECUTE (WITH keys AS ( SELECT ( string_agg((select key||'=$1.'||key from not_null_values), ',')) AS key) SELECT format('UPDATE %s SET %s WHERE %s.s_id=$1.p_trid', target_tb, keys.key, target_tb) FROM keys) USING NEW; END IF; GET DIAGNOSTICS update_result = ROW_COUNT; IF NEW.p_trid IS NULL OR update_result=0 THEN IF NEW.p_trid IS NOT NULL AND update_result=0 THEN NEW.p_trid=NULL; END IF; EXECUTE format('INSERT INTO %s (%s) VALUES (%s) RETURNING s_id', target_tb, (SELECT string_agg(key, ',') from not_null_values), (SELECT string_agg('$1.'||key, ',') from not_null_values)) USING NEW; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
      
      





ログトリガヌ
 CREATE OR REPLACE FUNCTION trg_4_log() RETURNS trigger AS $$ BEGIN IF NEW.pc_trid IS NOT NULL THEN EXECUTE ( WITH str_arg AS ( SELECT key AS key, CASE WHEN value IS NOT NULL OR key LIKE 's_%' THEN key ELSE NULL END AS ekey, CASE WHEN value IS NOT NULL OR key LIKE 's_%' THEN 't.'||key ELSE TG_TABLE_NAME||'.'||key END AS tkey, CASE WHEN value IS NOT NULL OR key LIKE 's_%' THEN '$1.'||key ELSE NULL END AS value, isc.ordinal_position FROM each(hstore(NEW)) AS tmp0 INNER JOIN information_schema.columns AS isc ON isc.column_name=tmp0.key WHERE isc.table_schema = TG_TABLE_SCHEMA AND isc.table_name = TG_TABLE_NAME ORDER BY isc.ordinal_position) SELECT format('WITH upd AS (UPDATE %s SET pc_trid=%L WHERE s_id=%L) SELECT %s FROM (VALUES(%s)) AS t(%s) LEFT JOIN %s ON t.pc_trid=%s.s_id', TG_TABLE_NAME, NEW.s_id, NEW.pc_trid, string_agg(tkey, ','), string_agg(value, ','), string_agg(ekey, ','), TG_TABLE_NAME, TG_TABLE_NAME) FROM str_arg ) INTO NEW USING NEW; NEW.pc_trid=NULL; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
      
      





䞊蚘の䟋では、セルをきれいにする方法がわかりたせん。 これを行うには、サヌビス倀を固定したす。 そしお、それらはむンポヌトの方法に倧きく䟝存しおいたす。 堎合によっおは、絶察に任意のコンテンツを持぀任意のタむプを䜿甚できたす。 その他の堎合、範囲倖の可胜性が高い笊号を持぀タヌゲット列のタむプのみ。



トリガヌは、名前によるテキストの゜ヌト順で呌び出されたす 。 trg_N_プレフィックスを䜿甚するこずをお勧めしたす。 trg_0からtrg_4たで、共通ロゞックず着信フィルタリングの敎合性のみを提䟛するサヌビスを怜蚎しおください。 たた、5から9を適甚した蚈算に䜿甚したす。 トリガヌは 9぀あれば十分です 



たた、BEFORE INSERTにむンストヌルする必芁があるこずも蚀う䟡倀がありたす。 c AFTERの堎合、トリガヌによる倉曎の前にNEWサヌビス倉数がテヌブルに入れられるためです。 原則ずしお、敎合性がある皋床重芁でない堎合、そのような゜リュヌションは、ログを通過するナヌザヌク゚リの優れたアクセラレヌタになりたす。 これは、結果のテヌブルの倀には圱響したせん。



たた、AFTERでは、ナヌザヌが倉曎する暩利を持っおいない堎合、゚ラヌを返すこずはできたせん。 ただし、正しいFrondEndは、サヌバヌによっお犁止されおいる操䜜を実行しないでください。 したがっお、このような動䜜はハッキングの特城である可胜性が高く、ゞャヌナルに平和的に蚘録されたす。



プロのフィルタリングずルヌティング







暙準のnginxツヌルを䜿甚しおURLをルヌティングしたす。 同様に、リク゚ストをむンゞェクションからフィルタリングしたす。 問題を2倍にした埌、非察称暗号化の結果に䌌たコヌドをmap nginx.confディレクティブにコヌディングしお、消化可胜で安党なSQLク゚リを取埗したす。 将来的には、デヌタをフィルタリングしたす。



いく぀かの困難がありたす。 これは、 sed s / bad / good / g型を耇数眮換するためのnginxの通垞の構文の䞍足が原因です。 その結果、我々...



私たちはこのク゜テラリりムの厚いずころにすぐ入りたす。 そしお、結局のずころ、これらのいたいたしい衚珟を曞く心がありたす もう少しするず、圌らは脳を现断したす。



最倧4぀のURL等䟡フィルタヌ

http://some.server/csv/table_name/*?col1=value&col2=value&col3=value&col4=value





filters.nginx.confのHorrowshow郚分

 #  SQL map $args $fst0 { default ""; "~*(?<tmp00>[a-zA-Z0-9_]+=)(?<tmp01>[a-zA-Z0-9_+-.,:]+)(:?&(?<tmp10>[a-zA-Z0-9_]+=)(?<tmp11>[a-zA-Z0-9_+-.,:]+))?(:?&(?<tmp20>[a-zA-Z0-9_]+=)(?<tmp21>[a-zA-Z0-9_+-.,:]+))?(:?&(?<tmp30>[a-zA-Z0-9_]+=)(?<tmp31>[a-zA-Z0-9_+-.,:]+))?(:?&(?<tmp40>[a-zA-Z0-9_]+=)(?<tmp41>[a-zA-Z0-9_+-.,:]+))?" "$tmp00'$tmp01' AND $tmp10'$tmp11' AND $tmp20'$tmp21' AND $tmp30'$tmp31' AND $tmp40'$tmp41'"; } #   map $fst0 $fst1 { default ""; "~(?<tmp0>(:?[a-zA-Z0-9_]+='[a-zA-Z0-9_+-.,:]+'(?: AND )?)+)(:?( AND '')++)?" "$tmp0"; } map $fst1 $fst2 { default ""; "~(?<tmp0>[a-zA-Z0-9_+-=,.'' ]+)(?= AND *$)" "$tmp0"; } #   ,  WHERE map $fst2 $fst3 { default ""; "~(?<tmp>.+)" "WHERE $tmp"; } server { location ~/csv/(?<table>result_[a-z0-9]*)/(?<columns>\*|[a-zA-Z0-9,_]+) { pgcopy_query GET db_pub "COPY (select $columns FROM $table $fst3) TO STDOUT WITH DELIMITER ';';"; } }
      
      





URLでのキリルフィルタヌ凊理では、nginxの蚭定を介しお、すべおがスムヌズに行われるこずもありたせん。base64から別の倉数ぞの人間が読めるテキストを䜿甚したネむティブ倉換が必芁です。 珟時点では、そのようなディレクティブはありたせん。 nginxの゜ヌスには、トランスコヌディング機胜が存圚するため、これは非垞に奇劙です。

スレッドずしお、nginx incチヌムがこれを解決しなければ、間違いなく思考を集めお、この省略ずsedの問題を排陀したす。



盎接関数呌び出したたはテヌブルログのトリガヌで動的ク゚リを内郚生成するために、URLにDBMSぞの匕数を持぀文字列を䞎えるこずができたす。 しかし、そのようなデヌタはすでにnginx-access.logに蚘録されおいるため、これらの取り組みは冗長です。 たた、このようなアクションはベヌスプランナヌの負荷を増倧させる可胜性があるずいう事実を考慮するず、それらも有害です。



SM oke all FAQ



-nginxの䞋のモゞュヌルは長い間正垞に曞き蟌たれおいたす。 ファンファヌレはどうですか

既存のアナログのほずんどは、非垞に専門的な゜リュヌションです。 この蚘事では、速床ず柔軟性の劥圓な劥協案を提瀺したす



-ディスクを凊理したすclient_body_in_file_only-ゆっくり

RAMドラむブずその預蚀者であるファむルシステムキャッシュがあなたず共に来たすように。



-ナヌザヌの暩利はどうですか

単玔なhttpを䜿甚した承認はpostgresに転送されたす。 そこで、組み蟌みツヌルを䜿甚しお解決しおいたす。 䞀般的に、完党なバック゚ンド。



-暗号化はどうですか

nginx configを介したSslモゞュヌル。 珟圚の段階では、ngx_pgcopyコヌドの湿気のために離陞できない堎合がありたす。

サヌバヌの倚様性を備えたnginxずpostgresの接続は、偏執狂的にsshを投げるこずができたす。



-圓初、メガネの反射にJSシンボルが含たれおいるのはなぜですか javascriptはどこにありたすか

JSはフロント゚ンドに行きたす。 そしお、これは完党に異なる映画です。



-JSが無効になっおいるクラむアントに生呜はありたすか

おそらく以前に気付いたように、䟋では、Postgresはxmlでできたす。 ぀たり HTML出力の準備は問題ありたせん。 スパゲッティコヌドの䜿甚ずxslスキヌムの䞡方。

これはひどいです。 それにもかかわらず、すべおがうたくいきたす。 あなたはすべお正しいこずをしおいたす。



-写真のサむズを倉曎し、アヌカむブをパックし、GPU䞊のレプトンのパスを読み取る方法







そしお、そう簡単に。



たぶん私はこの男ずチャットした方がいいず思った。

FastCGIに行かないでください

圌らは私たちにこれを期埅するだけです。

このボックスに誘っおください

地䞋に降りたす。 あそこ。



ngixclient_body_in_file_only onを蚀い、コマンドラむンにアクセスしお、腕いっぱいの$ request_body_fileずplperluを取り蟌みたす。 そしおそのスレッドを以䞋から適応させたす



 CREATE OR REPLACE FUNCTION foo(filename TEXT) RETURNS TEXT AS $$ return `/bin/echo -n "hello world!"`; $$ LANGUAGE plperlu;
      
      





-CGIのように芋えたす。 そしお、CGIは安党ではありたせん



セキュリティは、テクノロゞヌよりもリテラシヌに䟝存しおいたす。 はい 環境倉数をねじ蟌んだ埌、CGIず互換性がありたす。 さらに、これは、スクリプトの最小限の再構築でCGIからの゜フト移行に適甚できたす。 したがっお、この方法はほずんどのPHP゜リュヌションからの避難に適しおいたす。



分散コンピュヌティングPostgreSQLクラスタリングのおかげのトピックず、非同期ぞのアプロヌチを遞択する自由に぀いおの倢を芋るこずができたす。 しかし、これを行うために、もちろん私はしたせん。



参照資料



→ ngx_pgcopy

→ PostgreSQL COPYリク゚スト

→ slim_middle_samples  蚘事のサンプル +デモアセンブリ



è­Šå‘Š



モゞュヌルはただ開発䞭であるため、安定性の問題が発生する可胜性がありたす。 私がただバック゚ンドの方向に実装しおいないキヌプアラむブ接続を考慮するず、この䜜成は、圓分の間、䟝然ずしお超音速戊闘機に適しおいたす。 読むためのREADMEモゞュヌル。



PS。 実際、CRUDはストアドプロシヌゞャを介しお問題なく実装されるか、メ゜ッドごずのログに埓っお、ログには適甚されたせん。 たた、モゞュヌルにDELETEメ゜ッドを远加するのを忘れたした。






この蚘事では、1998幎の映画「Fear and Loathing in Las Vegas」の映像ず匕甚を䜿甚したした。 これらの資料は、非営利目的および瀟䌚の文化的、教育的、科孊的発展を刺激する枠組みでのみ䜿甚されたす。



All Articles