āĻĒāϰāĻŋāώā§āĻāĻžāϰ Go āĻĄā§āĻāĻž āϞā§āϝāĻŧāĻžāϰā§āϰ āĻāύā§āϝ Go āĻā§āύā§āϰāĻŋāĻāϏ CRUD āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ
āĻĒāĻžāĻ āĻā§āϤāĻŋāĻāĻāĻžāĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝā§āĻā§āϝ Go āĻā§āύā§āϰāĻŋāĻ CRUD āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āĻļāĻŋāĻā§āύ: āĻĒā§āύāϰāĻžāϝāĻŧ āĻŦā§āϝāĻŦāĻšāĻžāϰāϝā§āĻā§āϝ List/Get/Create/Update/Delete āĻĢā§āϞā§, āϏā§āĻĒāώā§āĻ āĻāύāϏā§āĻā§āϰā§āĻāύā§āĻ, reflection āĻāĻžāĻĄāĻŧāĻž āĻāĻŦāĻ āĻĒāĻĄāĻŧāϤ⧠āϏāĻšāĻ āĻā§āĻĄāĨ¤

āĻā§āύ Go-āϤ⧠CRUD āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻāĻžāĻŽā§āϞāĻžāϝāĻŧ āĻĒāĻĄāĻŧā§\n\nCRUD āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻļā§āϰā§āϤ⧠āϏāĻžāϧāĻžāϰāĻŖ āĻšāϝāĻŧāĨ¤ āĻāĻĒāύāĻŋ āϞāĻŋāĻā§āύ GetUser, āĻĒāϰ⧠ListUsers, āϤāĻžāϰāĻĒāϰ Orders, āϤāĻžāϰāĻĒāϰ InvoicesāĨ¤ āĻāϝāĻŧā§āĻāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋ āĻĒāϰ⧠āĻĄā§āĻāĻž āϞā§āϝāĻŧāĻžāϰ āύāĻāϞ āĻāĻĒāĻŋāϰ āĻā§āĻā§āĻ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧ āϝā§āĻāĻžāύ⧠āĻā§āĻ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻā§āϞ⧠āĻšāĻžāϰāĻŋāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤\n\nāϏāĻŦāĻā§āϝāĻŧā§ āĻŦā§āĻļāĻŋ āϝā§āĻāĻž āĻŦāĻžāϰāĻŦāĻžāϰ āĻšāϝāĻŧ āϤāĻž SQL āύāϝāĻŧāĨ¤ āϏā§āĻāĻž āĻšāĻā§āĻā§ āĻāĻžāϰāĻĒāĻžāĻļā§āϰ āĻĒā§āϰāĻŦāĻžāĻš: āĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāϞāĻžāύā§, āϰ⧠āϏā§āĻā§āϝāĻžāύ āĻāϰāĻž, ânot foundâ āĻšā§āϝāĻžāύā§āĻĄāϞ āĻāϰāĻž, āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāϰāϰāĻā§āϞ⧠āĻŽā§āϝāĻžāĻĒ āĻāϰāĻž, pagination āĻĄāĻŋāĻĢāϞā§āĻ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰāĻž, āĻāĻŦāĻ āĻāύāĻĒā§āĻāĻā§āϞ⧠āϏāĻ āĻŋāĻ āĻāĻžāĻāĻĒā§ āĻāύāĻāĻžāϰā§āĻ āĻāϰāĻžāĨ¤\n\nāĻĒāϰāĻŋāĻāĻŋāϤ āĻšāĻāϏā§āĻĒāĻāĻā§āϞā§: āĻāĻĒāĻŋāĻā§āϤ Scan āĻā§āĻĄ, context.Context āĻāĻŦāĻ āĻā§āϰāĻžāύāĻā§āĻāĻļāύ āĻĒā§āϝāĻžāĻāĻžāϰā§āύā§āϰ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ, boilerplate LIMIT/OFFSET āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ (āĻāĻāύ⧠āĻāĻāύ⧠total count-āϏāĻš), â0 rows means not foundâ āĻā§āĻ, āĻāĻŦāĻ āĻāĻĒāĻŋ-āĻĒā§āϏā§āĻ āĻāϰāĻž INSERT ... RETURNING id āĻā§āϝāĻžāϰāĻŋāϝāĻŧā§āĻļāύāĨ¤\n\nāϝāĻāύ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āĻā§āώāϤāĻŋāϤāĻāϰ āĻšāϝāĻŧā§ āĻāĻ ā§, āĻ
āύā§āĻ āĻāĻŋāĻŽ reflection-āĻ āĻšāĻžāϤ āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧāĨ¤ āĻāĻāĻŋ âāĻāĻāĻŦāĻžāϰ āϞāĻŋāĻā§āύâ CRUD-āĻāϰ āĻĒā§āϰāϤāĻŋāĻļā§āϰā§āϤāĻŋ āĻĻā§āϝāĻŧ: āϝ⧠āĻā§āύ⧠struct āύāĻŋāύ āĻāĻŦāĻ āĻāϞāĻžāĻŽāĻā§āϞ⧠āϰuntime-āĻ āĻāϰāĻŋāϝāĻŧā§ āĻĻāĻŋāύāĨ¤ āĻāϰāĻ āĻĒāϰ⧠āĻĻā§āĻāĻž āϝāĻžāϝāĻŧāĨ¤ reflection-āĻāĻŋāϤā§āϤāĻŋāĻ āĻā§āĻĄ āĻĒāĻĄāĻŧāϤ⧠āĻāĻ āĻŋāύ, IDE āϏāĻŽāϰā§āĻĨāύ āĻāĻžāϰāĻžāĻĒ āĻšāϝāĻŧ, āĻāĻŦāĻ āĻŦā§āϝāϰā§āĻĨāϤāĻž compile time āĻĨā§āĻā§ runtime-āĻ āĻāϞ⧠āϝāĻžāϝāĻŧāĨ¤ āĻĢāĻŋāϞā§āĻĄā§āϰ āύāĻžāĻŽ āĻŦāĻĻāϞāĻžāύ⧠āĻŦāĻž nullable āĻāϞāĻžāĻŽ āϝā§āĻ āĻāϰāĻž āĻā§āĻ āĻŦāĻĻāϞāĻā§āϞ⧠āĻā§āĻŦāϞ āĻā§āϏā§āĻ āĻŦāĻž āĻĒā§āϰā§āĻĄāĻžāĻāĻļāύ⧠āĻāĻļā§āĻāϰā§āϝāϤāĻž āϤā§āϰāĻŋ āĻāϰā§āĨ¤\n\nāĻāĻžāĻāĻĒ-āϏā§āĻĢ āĻĒā§āύāĻāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻŽāĻžāύ⧠āĻšāϞ⧠CRUD āĻĢā§āϞ⧠āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āĻāĻŋāύā§āϤ⧠Go-āĻāϰ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύā§āϰ āϏā§āĻŦāĻŋāϧāĻžāĻā§āϞ⧠āĻšāĻžāϰāĻžāύ⧠āύāϝāĻŧ: āĻĒāϰāĻŋāώā§āĻāĻžāϰ āϏāĻŋāĻāύā§āĻāĻžāϰ, āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ-āĻā§āĻāĻĄ āĻāĻžāĻāĻĒ, āĻāĻŦāĻ autocomplete āϝāĻž āϏāϤā§āϝāĻŋāĻ āϏāĻšāĻžāϝāĻŧāĻāĨ¤ āĻā§āύā§āϰāĻŋāĻāϏ āĻĻāĻŋāϝāĻŧā§ āĻāĻĒāύāĻŋ Get[T] āĻ List[T] āĻŽāϤ⧠āĻ
āĻĒāĻžāϰā§āĻļāύ reuse āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āĻāĻāĻ āϏāĻŽāϝāĻŧā§ āĻĒā§āϰāϤā§āϝā§āĻ āĻāύā§āĻāĻŋāĻāĻŋ āĻĨā§āĻā§ āϝ⧠āĻ
āĻāĻļāĻā§āϞ⧠āĻ
āύā§āĻŽāĻžāύ āĻāϰāĻž āϝāĻžāϝāĻŧ āύāĻž (āϝā§āĻŽāύ āĻāĻŋāĻāĻžāĻŦā§ āĻāĻāĻāĻŋ āϰ⧠T-āϤ⧠āϏā§āĻā§āϝāĻžāύ āĻāϰāϤ⧠āĻšāϝāĻŧ) āϏā§āĻā§āϞ⧠āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āĻĻāĻžāĻŦāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤\n\nāĻāĻ āĻĒā§āϝāĻžāĻāĻžāϰā§āύāĻāĻŋ āĻāĻā§āĻāĻžāĻā§āϤāĻāĻžāĻŦā§ āĻĄā§āĻāĻž āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āϞā§āϝāĻŧāĻžāϰā§āϰ āϏāĻŽā§āĻĒāϰā§āĻā§āĨ¤ āĻāĻāĻŋ SQL āĻ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āĻāύāϏāĻŋāϏā§āĻā§āύā§āĻ āĻ āύāĻŋāϏā§āϤā§āĻ āϰāĻžāĻā§āĨ¤ āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĄā§āĻŽā§āĻāύ āĻŽāĻĄā§āϞ āĻāϰāĻžāϰ āĻŦāĻž āĻŦāĻŋāĻāύā§āϏ āϰā§āϞ āĻāϰā§āĻĒ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰ⧠āύāĻž, āĻāĻŋāĻāĻŦāĻž āϏāĻžāϰā§āĻāĻŋāϏ-āϞā§āĻā§āϞ āϞāĻāĻŋāĻ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāύ āĻāϰ⧠āύāĻžāĨ¤\n\n## āĻĄāĻŋāĻāĻžāĻāύ āϞāĻā§āώā§āϝ (āĻ āĻāĻŋ āĻŦāĻŋāώāϝāĻŧāϏāĻŽā§āĻš āĻāĻāĻžāύ⧠āϏāĻŽāĻžāϧāĻžāύ āĻšāĻŦā§ āύāĻž)\n\nāĻāĻāĻāĻŋ āĻāĻžāϞ⧠āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āĻĒā§āϰāϤāĻŋāĻĻāĻŋāύā§āϰ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻ
ā§āϝāĻžāĻā§āϏā§āϏāĻā§ āĻĒā§āϰā§āĻŦāĻžāύā§āĻŽāĻžāύāϝā§āĻā§āϝ āĻāϰ⧠āϤā§āϞā§āĨ¤ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒāĻĄāĻŧāϞā§āĻ āĻĻā§āϰā§āϤ āĻŦā§āĻā§ āĻĢā§āϞāϤ⧠āĻĒāĻžāϰā§āύ āĻāĻāĻž āĻā§ āĻāϰāĻā§, āĻā§āύ SQL āĻāĻžāϞāĻžāϝāĻŧ, āĻāĻŦāĻ āĻā§āύ āĻāϰāϰāĻā§āϞ⧠āĻĢā§āϰāϤ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§āĨ¤\n\nāϞāĻā§āώā§āϝāĻā§āϞ⧠āϏāĻšāĻ:\n\n- āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ āĻĒāϰā§āϝāύā§āϤ āĻāĻžāĻāĻĒ āϏā§āĻĢāĻāĻŋ (IDs, entities, āĻ results any āύāϝāĻŧ)\n- āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻžāĻā§āϞ⧠āĻāĻĻā§āĻĻā§āĻļā§āϝ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰāĻŦā§ āĻāĻžāĻāĻ āĻāĻžāĻāĻĒ-āĻāĻŋāĻŽāύā§āϝāĻžāϏā§āĻāĻŋāĻāϏ āĻāĻžāĻĄāĻŧāĻž\n- āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻāĻāϰāĻŖ āϞā§āĻā§āϝāĻŧ āύāĻž āĻāĻŽāύāĻāĻžāĻŦā§ āĻŦā§āϝāĻŧāĻžāĻāϞāĻžāϰāĻĒā§āϞā§āĻ āĻāĻŽāĻžāύā§\n- List/Get/Create/Update/Delete āĻā§āĻĄāĻŧā§ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻ āĻāĻāϰāĻŖ\n\nāύāύ-āĻā§āϞāĻā§āϞā§āĻ āϏāĻŽāĻžāύāĻāĻžāĻŦā§ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤ āĻāĻāĻž ORM āύāϝāĻŧāĨ¤ āĻāĻāĻŋ āĻĢāĻŋāϞā§āĻĄ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āĻ
āύā§āĻŽāĻžāύ āĻāϰāĻž, āĻā§āĻŦāĻŋāϞ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ join āĻāϰāĻž, āĻŦāĻž āύā§āϰāĻŦāĻāĻžāĻŦā§ āĻā§āϝāĻŧā§āϰāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻāĻāĻŋāϤ āύāϝāĻŧāĨ¤ âāĻŽā§āϝāĻžāĻāĻŋāĻ āĻŽā§āϝāĻžāĻĒāĻŋāĻâ āĻāĻĒāύāĻžāĻā§ āĻĒā§āύāϰāĻžāϝāĻŧ reflection, āĻā§āϝāĻžāĻāϏ, āĻ āĻāĻ āĻā§āϏ⧠āĻĢāĻŋāϰ⧠āύāĻŋāϝāĻŧā§ āϝāĻžāĻŦā§āĨ¤\n\nāϏāĻžāϧāĻžāϰāĻŖ SQL āĻāϝāĻŧāĻžāϰā§āĻāĻĢā§āϞ⧠āϧāϰ⧠āύāĻŋāύ: āϏā§āĻĒāώā§āĻ SQL (āĻŦāĻž āĻĒāĻžāϤāϞāĻž query builder), āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻā§āϰāĻžāύāĻā§āĻāĻļāύ āϏā§āĻŽāĻž, āĻāĻŦāĻ āĻāĻŽāύ āĻāϰāϰāĻā§āϞ⧠āϝā§āĻā§āϞ⧠āĻāĻĒāύāĻŋ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰ⧠āϏāĻŽāϏā§āϝāĻž āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤ āϝāĻāύ āĻāĻŋāĻā§ āĻŦā§āϝāϰā§āĻĨ āĻšāϝāĻŧ, āĻāϰāϰāĻāĻž āĻŦāϞāĻŦā§ ânot foundâ, âconflict/constraint violationâ, āĻŦāĻž âDB unavailableâ â āύāĻž āϝ⧠āĻ
āϏā§āĻĒāώā§āĻ ârepository errorâāĨ¤\n\nāĻā§ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϤ⧠āĻšāĻŦā§ āϤāĻž āĻšāϞ⧠āĻā§āύāĻāĻž āĻā§āύā§āϰāĻŋāĻ āĻšāĻŦā§ āĻāĻŦāĻ āĻā§āύāĻāĻž āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋāϰ āĻāύā§āϝ āϰā§āĻā§ āĻĻā§āĻŦā§āύāĨ¤\n\n- āĻā§āύā§āϰāĻŋāĻ: āĻĒā§āϰāĻŦāĻžāĻš (āĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāϞāĻžāύā§, āϏā§āĻā§āϝāĻžāύ, āĻāĻžāĻāĻĒā§āĻĄ āĻā§āϝāĻžāϞ⧠āĻĢā§āϰāϤ, āϏāĻžāϧāĻžāϰāĻŖ āĻāϰāϰ āĻ
āύā§āĻŦāĻžāĻĻ)āĨ¤\n- āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋ: āĻ
āϰā§āĻĨ (āĻā§āĻŦāĻŋāϞ āύāĻžāĻŽ, āϏāĻŋāϞā§āĻā§āĻ āĻāϰāĻž āĻāϞāĻžāĻŽ, joins, āĻāĻŦāĻ SQL āϏā§āĻā§āϰāĻŋāĻ)āĨ¤\n\nāϏāĻŦ āĻāύā§āĻāĻŋāĻāĻŋāĻā§ āĻāĻāĻ āĻĢāĻŋāϞā§āĻāĻžāϰ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻā§āϰ āĻāϰāϞ⧠āĻā§āĻĄ āĻĒāĻĄāĻŧāϤ⧠āĻāĻ āĻŋāύ āĻšāϝāĻŧā§ āĻĒāĻĄāĻŧā§ â āĻ
āύā§āĻāĻā§āώā§āϤā§āϰ⧠two clear queries āϞā§āĻāĻž āϏāĻšāĻāĨ¤\n\n## āĻāύā§āĻāĻŋāĻāĻŋ āĻāĻŦāĻ ID āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰāĻž\n\nāĻ
āϧāĻŋāĻāĻžāĻāĻļ CRUD āĻā§āĻĄ āĻŦāĻžāϰāĻŦāĻžāϰ āĻšāϝāĻŧ āĻāĻžāϰāĻŖ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻā§āĻŦāĻŋāϞ⧠āĻāĻāĻ āĻŽā§āϞāĻŋāĻ āĻāĻžāĻāĻā§āϞ⧠āĻāĻā§, āĻāĻŋāύā§āϤ⧠āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋāϰ āύāĻŋāĻāϏā§āĻŦ āĻĢāĻŋāϞā§āĻĄāĨ¤ āĻā§āύā§āϰāĻŋāĻāϏ āύāĻŋāϝāĻŧā§ āĻā§āĻļāϞ āĻšāϞ āĻāĻāĻāĻŋ āĻā§āĻ āĻļā§āĻĒ āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āĻāĻŦāĻ āĻŦāĻžāĻāĻŋāĻāĻž āĻŽā§āĻā§āϤ āϰāĻžāĻāĻžāĨ¤\n\nāĻļā§āϰā§āϤ⧠āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāύ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦā§ āĻāύā§āĻāĻŋāĻāĻŋ āϏāĻŽā§āĻĒāϰā§āĻā§ āĻā§ āĻāĻžāύāϤ⧠āĻšāĻŦā§āĨ¤ āĻ
āύā§āĻ āĻĻāϞā§āϰ āĻāύā§āϝ āĻāĻāĻŽāĻžāϤā§āϰ āϏāĻžāϰā§āĻŦāĻāύā§āύ āĻ
āĻāĻļ āĻšāϞ IDāĨ¤ āĻāĻžāĻāĻŽāϏā§āĻā§āϝāĻžāĻŽā§āĻĒ āĻĻāϰāĻāĻžāϰ āĻšāϤ⧠āĻĒāĻžāϰā§, āĻāĻŋāύā§āϤ⧠āϏāĻŦ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ āĻŦāĻžāϧā§āϝ āĻāϰāϞ⧠āĻŽāĻĄā§āϞ āĻāĻžāύāĻāĻŋ āĻŽāύ⧠āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤\n\n### āĻāĻŽāύ āĻāĻāĻāĻŋ ID āĻāĻžāĻāĻĒ āĻŦā§āĻā§ āύāĻŋāύ āϝāĻžāϤ⧠āĻāĻĒāύāĻŋ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āύ\n\nāĻāĻĒāύāĻžāϰ ID āĻāĻžāĻāĻĒāĻāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āϏ⧠āĻāĻŋāĻāĻžāĻŦā§ āϏāĻžāϰāĻŋ āĻļāύāĻžāĻā§āϤ āĻšāϝāĻŧ āϤāĻžāϰ āĻŽāĻŋāϞ āϰāĻžāĻāĻž āĻāĻāĻŋāϤāĨ¤ āĻāĻŋāĻā§ āĻĒā§āϰāĻā§āĻā§āĻ int64 āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āĻ
āύā§āϝāϰāĻž UUID stringāĨ¤ āϝāĻĻāĻŋ āĻāĻāĻāĻŋ āĻ
āĻāĻŋāύā§āύ āĻĒāĻĻā§āϧāϤāĻŋ āϏāĻžāϰā§āĻāĻŋāϏāĻā§āĻĄāĻŧā§ āĻāĻžāĻ āĻāϰā§, āϤāĻžāĻšāϞ⧠ID āĻā§āύā§āϰāĻŋāĻ āĻāϰā§āύāĨ¤ āϝāĻĻāĻŋ āĻĒā§āϰ⧠āĻā§āĻĄāĻŦā§āϏ āĻāĻāĻāĻŋ ID āĻāĻžāĻāĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§, āϏā§āĻāĻŋ āĻĢāĻŋāĻā§āϏ āĻāϰ⧠āϰāĻžāĻāĻž āϏāĻŋāĻāύā§āĻāĻžāϰ āĻā§āĻ āϰāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤\n\nāĻāĻāĻāĻŋ āĻāĻžāϞ āĻĄāĻŋāĻĢāϞā§āĻ āĻāύāϏā§āĻā§āϰā§āĻāύā§āĻ āĻšāϞ⧠comparable, āĻāĻžāϰāĻŖ āĻāĻĒāύāĻŋ ID āϤā§āϞāύāĻž āĻāϰāĻŦā§āύ, map āĻā§ āĻšāĻŋāϏā§āĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ, āĻāĻŦāĻ āĻāĻā§āϞ⧠āĻĒāĻžāϏ āĻāϰāĻŦā§āύāĨ¤\n\ngo\ntype ID interface {\n\tcomparable\n}\n\ntype Entity[IDT ID] interface {\n\tGetID() IDT\n\tSetID(IDT)\n}\n\n\n### āĻāύā§āĻāĻŋāĻāĻŋ āĻāύāϏā§āĻā§āϰā§āĻāύā§āĻ āϝāϤāĻāĻž āϏāĻŽā§āĻāĻŦ āĻā§āĻ āϰāĻžāĻā§āύ\n\nstruct embedding āĻŦāĻž ~struct{...} āĻŽāϤ⧠āĻāĻžāĻāĻĒ-āϏā§āĻ āĻā§āϰāĻŋāĻāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĢāĻŋāϞā§āĻĄ āĻŦāĻžāϧā§āϝ āĻāϰāĻž āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āĻāϞā§āύāĨ¤ āĻāĻā§āϞ⧠āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āĻĻā§āĻāĻžāϝāĻŧ, āϤāĻŦā§ āĻāĻĒāύāĻžāϰ āĻĄā§āĻŽā§āĻāύ āĻāĻžāĻāĻĒāĻā§āϞā§āĻā§ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒā§āϝāĻžāĻāĻžāϰā§āύā§āϰ āϏāĻā§āĻā§ āĻā§āĻĄāĻŧā§ āĻĻā§āĻŦā§āĨ¤\n\nāĻŦāϰāĻ, āĻā§āĻŦāϞ āϏā§āĻāĻā§āϞ⧠āĻĻāĻžāĻŦāĻŋ āĻāϰā§āύ āϝā§āĻā§āϞ⧠āĻļā§āϝāĻŧāĻžāϰā§āĻĄ CRUD āĻĒā§āϰāĻŦāĻžāĻšāĻā§ āϞāĻžāĻā§:\n\n- ID āĻĒā§āϤ⧠āĻ āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰāĻž (āϤāĻžāϤ⧠Create ID āĻĢā§āϰāϤ āĻĻāĻŋāϤ⧠āĻĒāĻžāϰā§, āĻāĻŦāĻ Update/Delete āϞāĻā§āώā§āϝ āĻāϰāϤ⧠āĻĒāĻžāϰā§)\n\nāĻĒāϰ⧠āϝāĻĻāĻŋ soft deletes āĻŦāĻž optimistic locking āϝā§āĻ āĻāϰāϤ⧠āĻāĻžāύ, āĻā§āĻ opt-in āĻāύā§āĻāĻžāϰāĻĢā§āϏ āϝā§āĻ āĻāϰā§āύ (āĻāĻĻāĻžāĻšāϰāĻŖ: GetVersion/SetVersion) āĻāĻŦāĻ āĻā§āĻŦāϞ āϝā§āĻāĻžāύ⧠āĻĻāϰāĻāĻžāϰ āϏā§āĻāĻžāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻā§āĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻā§āϞ⧠āϏāĻžāϧāĻžāϰāύāϤ āĻāĻžāϞā§āĻāĻžāĻŦā§ āĻŦāϝāĻŧāϏ āĻŦāĻžāĻĄāĻŧāĻžāϝāĻŧāĨ¤\n\n## āĻāĻāĻāĻŋ āĻā§āύā§āϰāĻŋāĻ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āϝāĻž āĻĒāĻĄāĻŧāϤ⧠āϏāĻšāĻ āĻĨāĻžāĻāĻŦā§\n\nāϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āĻāĻĒāύāĻŋ āϝāĻž āĻāĻžāύ āϤāĻž āĻŦāϰā§āĻŖāύāĻž āĻāϰā§āύ, āύāĻž āϝ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰ⧠āϤāĻžāĨ¤ āϝāĻĻāĻŋ āĻāύā§āĻāĻžāϰāĻĢā§āϏ SQL-āϰ āĻŽāϤ⧠āĻšāϝāĻŧ, āϤāĻž āϏāϰā§āĻŦāϤā§āϰ āĻĄāĻŋāĻā§āĻāϞ āĻĢāĻžāĻāϏ āĻāϰā§āĨ¤\n\nāĻŽā§āĻĨāĻĄ āϏā§āĻ āĻā§āĻ āĻ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āϰāĻžāĻā§āύāĨ¤ context.Context āĻĒā§āϰāĻĨāĻŽ āĻĻāĻŋāύ, āϤāĻžāϰāĻĒāϰ āĻĒā§āϰāϧāĻžāύ āĻāύāĻĒā§āĻ (ID āĻŦāĻž āĻĄā§āĻāĻž), āϤāĻžāϰāĻĒāϰ āĻŦāĻŋāĻāϞā§āĻĒ āύāĻāϏāĻā§āϞ⧠āĻāĻāĻāĻŋ struct-āĻ āĻŦāĻžāύā§āĻĄā§āϞ āĻāϰā§āύāĨ¤\n\ngo\ntype Repository[T any, ID comparable, CreateIn any, UpdateIn any, ListQ any] interface {\n\tGet(ctx context.Context, id ID) (T, error)\n\tList(ctx context.Context, q ListQ) ([]T, error)\n\tCreate(ctx context.Context, in CreateIn) (T, error)\n\tUpdate(ctx context.Context, id ID, in UpdateIn) (T, error)\n\tDelete(ctx context.Context, id ID) error\n}\n\n\nList-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻžāϰā§āĻŦāĻāύā§āύ āĻĢāĻŋāϞā§āĻāĻžāϰ āĻāĻžāĻāĻĒ āĻā§āϰ āύāĻž āĻāϰāĻž āĻāĻžāϞāĨ¤ āĻĢāĻŋāϞā§āĻāĻžāϰāĻā§āϞā§āĻ āĻāύā§āĻāĻŋāĻāĻŋāĻā§āϞā§āϰ āĻŽāϧā§āϝ⧠āϏāĻŦāĻā§āϝāĻŧā§ āĻāϞāĻžāĻĻāĻžāĨ¤ āĻāĻāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻŋāĻ āĻĒāĻĻā§āϧāϤāĻŋ āĻšāϞ⧠āĻĒā§āϰāϤāĻŋ-āĻāύā§āĻāĻŋāĻāĻŋ āĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāĻāĻĒ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻā§āĻ āĻļā§āϝāĻŧāĻžāϰā§āĻĄ pagination shape āĻāĻĒāύāĻŋ embed āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤\n\ngo\ntype Page struct {\n\tLimit int\n\tOffset int\n}\n\n\nāĻāϰāϰ āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ āĻāĻŽāύ āĻāĻžāϝāĻŧāĻāĻž āϝā§āĻāĻžāύ⧠āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒā§āϰāĻžāϝāĻŧāĻļāĻ āĻā§āϞāĻŽāĻžāϞ āĻāϰā§āĨ¤ āĻāĻā§āĻ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāύ āĻā§āύ āĻāϰāϰāĻā§āϞā§āϰ āĻāĻĒāϰ āĻāϞāĻžāϰāϰāĻž āĻļāĻžāĻāĻž āĻāϰāĻŦā§āĨ¤ āϏāĻžāϧāĻžāϰāĻŖ āϏā§āĻāĻāĻŋ āĻāĻžāĻ āĻāϰā§:\n\n- ErrNotFound āϝāĻāύ āĻā§āύ⧠ID āύā§āĻ\n- ErrConflict āĻāĻāύāĻŋāĻ āĻŦā§āϝāϰā§āĻĨāϤāĻž āĻŦāĻž āĻāĻžāϰā§āϏāύ āϏāĻāĻāϰā§āώā§āϰ āĻāύā§āϝ\n- ErrValidation āĻāύāĻĒā§āĻ āĻ
āĻŦā§āϧ āĻšāϞ⧠(āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āϝāĻĻāĻŋ āϰāĻŋāĻĒā§ āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻ āĻāϰā§)\n\nāĻŦāĻžāĻāĻŋ āϏāĻŦāĻāĻŋāĻā§ low-level āĻāϰāϰ āĻšāĻŋāϏā§āĻŦā§ wrap āĻāϰā§āύ (DB/network)āĨ¤ āĻāĻ āĻāύāĻā§āϰāĻžāĻā§āĻ āĻĨāĻžāĻāϞ⧠āϏāĻžāϰā§āĻāĻŋāϏ āĻā§āĻĄ ânot foundâ āĻŦāĻž âconflictâ āĻšā§āϝāĻžāύā§āĻĄāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§ āϤāĻžāϰ āĻĒāϰā§āϰ āϏā§āĻā§āϰā§āĻ āĻāĻŋ PostgreSQL āύāĻžāĻāĻŋ āĻ
āύā§āϝ āĻāĻŋāĻā§ āϏā§āĻāĻž āύāĻŋāϝāĻŧā§ āĻāĻŋāύā§āϤāĻž āύāĻž āĻāϰā§āĨ¤\n\n## āĻāĻŋāĻāĻžāĻŦā§ reflection āĻāĻžāĻĄāĻŧāĻžāĻ āĻĢā§āϞ⧠reuse āĻāϰāĻŦā§āύ\n\nReflection āϏāĻžāϧāĻžāϰāĻŖāϤ āϤāĻāύ āĻĒā§āϰāĻŦā§āĻļ āĻāϰ⧠āϝāĻāύ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻā§āĻĄ āĻāĻžāύ āϝāĻž âāĻā§āύāĻ struct-āĻ āĻĒā§āϰāĻŖ āĻāϰāĻŦā§âāĨ¤ āĻāĻāĻŋ āϤā§āϰā§āĻāĻŋāĻā§āϞ⧠runtime-āĻ āϞā§āĻāĻžāϝāĻŧ āĻāĻŦāĻ āύāĻŋāϝāĻŧāĻŽāĻā§āϞ⧠āĻ
āϏā§āĻĒāώā§āĻ āĻāϰā§āĨ¤\n\nāĻāĻāĻāĻŋ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ āĻšāϞ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āύāĻŋāϏā§āϤā§āĻ āĻ
āĻāĻļāĻā§āϞ⧠reuse āĻāϰāĻž: āĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāϞāĻžāύā§, āϰ⧠āϞā§āĻĒ, āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āϰ⧠āĻāĻŖāύāĻž āĻā§āĻ, āĻāĻŦāĻ āĻāϰāϰāĻā§āϞāĻŋ āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻāĻāĻžāĻŦā§ wrap āĻāϰāĻžāĨ¤ struct-āĻ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āϏā§āĻĒāώā§āĻ āϰāĻžāĻā§āύāĨ¤\n\n### āĻĻāĻžāϝāĻŧāĻŋāϤā§āĻŦ āĻāĻžāĻ āĻāϰā§āύ: SQL, āĻŽā§āϝāĻžāĻĒāĻŋāĻ, āĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻĢā§āϞā§\n\nāĻĒā§āϰāĻžāϝāĻŧā§āĻāĻŋāĻ āĻāĻžāĻāĻĻāĻžāϰāĻŋ āĻĻā§āĻāϤ⧠āĻāĻŽāύ āĻšāϤ⧠āĻĒāĻžāϰā§:\n\n- āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋ: SQL āϏā§āĻā§āϰāĻŋāĻ āĻ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāĻāĻžāϰ āĻ
āϰā§āĻĄāĻžāϰ āĻāĻ āϏā§āĻĨāĻžāύ⧠āϰāĻžāĻā§āύ\n- āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋ: āĻā§āĻ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻā§āύ āϝāĻž āϰā§āĻā§ āĻāύāĻā§āϰāĻŋāĻ struct-āĻ āϏā§āĻā§āϝāĻžāύ āĻāϰā§\n- āĻā§āύā§āϰāĻŋāĻ: āĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻĢā§āϞ⧠āĻĒā§āϰāĻĻāĻžāύ āĻāϰāĻŦā§ āϝāĻž āĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāϞāĻžāϝāĻŧ āĻāĻŦāĻ āĻŽā§āϝāĻžāĻĒāĻžāϰ āĻāϞ āĻāϰā§\n\nāĻāĻāĻžāĻŦā§ āĻā§āύā§āϰāĻŋāĻāϏ āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āĻāĻŽāĻžāϝāĻŧ āĻāĻŋāύā§āϤ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻŋ āĻāϰāĻā§ āϏā§āĻāĻž āϞā§āĻāĻžāϝāĻŧ āύāĻžāĨ¤\n\nāύāĻŋāĻā§ āĻāĻāĻāĻŋ āĻā§āĻ āĻ
ā§āϝāĻžāĻŦāϏā§āĻā§āϰāĻžāĻāĻļāύ āĻāĻā§ āϝāĻž *sql.DB āĻŦāĻž *sql.Tx āĻĻā§āĻā§āĻā§āĻ āĻĒāĻžāϏ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ: \n\ngo\ntype DBTX interface {\n\tExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)\n\tQueryContext(ctx context.Context, query string, args ...any) (*sql.Rows, error)\n\tQueryRowContext(ctx context.Context, query string, args ...any) *sql.Row\n}\n\n\n### āĻā§āύā§āϰāĻŋāĻāϏ āĻā§ āĻāϰāĻž āĻāĻāĻŋāϤ (āĻ āĻā§ āύāĻž)\n\nāĻā§āύā§āϰāĻŋāĻ āϏā§āϤāϰāĻāĻŋ āĻāĻĒāύāĻžāϰ struct âāĻŦā§āĻāĻžāϰâ āĻā§āώā§āĻāĻž āĻāϰāĻŦā§ āύāĻžāĨ¤ āĻŦāϰāĻ āĻāĻāĻŋ āϏā§āĻĒāώā§āĻ āĻĢāĻžāĻāĻļāύ āύā§āĻŦā§, āϝā§āĻŽāύ:\n\n- āĻāĻāĻāĻŋ binder āϝāĻž āĻāύāĻĒā§āĻāĻā§ āĻā§āϝāĻŧā§āϰāĻŋ āĻāϰā§āĻāϏ-āĻ āĻĒāϰāĻŋāĻŖāϤ āĻāϰā§\n- āĻāĻāĻāĻŋ scanner āϝāĻž āĻāϞāĻžāĻŽāĻā§āϞ⧠entity-āϤ⧠āĻĒāĻĄāĻŧā§\n\nāĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāĻāĻāĻŋ Customer āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ SQL āĻāύāϏā§āĻā§āϝāĻžāύā§āĻ (selectByID, insert, update) āĻšāĻŋāϏāĻžāĻŦā§ āϰāĻžāĻā§ āĻāĻŦāĻ āĻāĻāĻŦāĻžāϰ scanCustomer(rows) āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰā§āĨ¤ āĻāĻāĻāĻŋ āĻā§āύā§āϰāĻŋāĻ List āϞā§āĻĒ, context, āĻ āĻāϰāϰ wrapping āĻšā§āϝāĻžāύā§āĻĄāϞ āĻāϰāĻŦā§, āĻāϰ scanCustomer āĻāĻžāĻāĻĒ-āϏā§āĻĢāĻāĻŋ āĻ āϏā§āĻĒāώā§āĻ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āϰāĻžāĻāĻŦā§āĨ¤\n\nāύāϤā§āύ āĻāϞāĻžāĻŽ āϝā§āĻ āĻāϰāϞ⧠SQL āĻ scanner āĻāĻĒāĻĄā§āĻ āĻāϰā§āύ â āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰāĻ āĻāĻĒāύāĻžāĻā§ āĻŦāϞāĻŦā§ āĻā§ āĻāĻžāĻā§āĻā§āĨ¤\n\n## āϧāĻžāĻĒā§ āϧāĻžāĻĒā§: āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰāĻž\n\nāϞāĻā§āώā§āϝ āĻšāϞ⧠List/Get/Create/Update/Delete-āĻāϰ āĻāύā§āϝ āĻāĻ reusable āĻĢā§āϞ⧠āϝā§āĻāĻž āĻĒā§āϰāϤāĻŋāĻāĻŋ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāĻā§ āϤāĻžāϰ SQL āĻ āϰ⧠āĻŽā§āϝāĻžāĻĒāĻŋāĻ āϏāĻŽā§āĻĒāϰā§āĻā§ āϏ⧠āϰāĻžāĻā§āĨ¤\n\n### 1) āĻā§āϰ āĻāĻžāĻāĻĒāĻā§āϞ⧠āϏāĻāĻā§āĻāĻžāϝāĻŧāĻŋāϤ āĻāϰā§āύ\n\nāĻāĻŽāĻĒāĻā§āώ⧠āϏā§āĻŽāĻžāĻŦāĻĻā§āϧāϤāĻž āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰā§āύāĨ¤ āĻāĻĒāύāĻžāϰ āĻā§āĻĄāĻŦā§āϏā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ ID āĻāĻžāĻāĻĒ āĻŦā§āĻā§ āύāĻŋāύ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āϰāĻžāĻā§āύāĨ¤\n\ngo\ntype ID interface{ ~int64 | ~string }\n\ntype Repo[E any, K ID] interface {\n\tGet(ctx context.Context, id K) (E, error)\n\tList(ctx context.Context, limit, offset int) ([]E, error)\n\tCreate(ctx context.Context, e *E) error\n\tUpdate(ctx context.Context, e *E) error\n\tDelete(ctx context.Context, id K) error\n}\n\n\n### 2) DB āĻ āĻā§āϰāĻžāύāĻā§āĻāĻļāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ executor āϝā§āĻ āĻāϰā§āύ\n\nāĻā§āύā§āϰāĻŋāĻ āĻā§āĻĄ āϏāϰāĻžāϏāϰāĻŋ *sql.DB āĻŦāĻž *sql.Tx-āĻāϰ āϏāĻā§āĻā§ āĻŦāĻžāĻāϧāĻŦā§āύ āύāĻžāĨ¤ āĻāĻāĻāĻŋ āĻā§āĻ executor āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻāϰ āĻāϰā§āύ āϝāĻž āĻāĻĒāύāĻŋ āĻĄāĻžāĻā§ (QueryContext, ExecContext, QueryRowContext)āĨ¤ āϏā§āĻŦāĻž āĻĨā§āĻā§ DB āĻŦāĻž āĻā§āϰāĻžāύāĻā§āĻāĻļāύ āĻĒāĻžāϏ āĻāϰāϞ⧠āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāϰ āĻā§āĻĄ āĻŦāĻĻāϞāĻžāϤ⧠āĻšāĻŦā§ āύāĻžāĨ¤\n\n### 3) āĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻĢā§āϞ⧠āϏāĻš āĻāĻāĻāĻŋ āĻā§āύā§āϰāĻŋāĻ āĻŦā§āϏ āϤā§āϰāĻŋ āĻāϰā§āύ\n\nbaseRepo[E,K] āϤā§āϰāĻŋ āĻāϰā§āύ āϝāĻž executor āĻāĻŦāĻ āĻāĻŋāĻā§ āĻĢāĻžāĻāĻļāύ āĻĢāĻŋāϞā§āĻĄ āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§āĨ¤ āĻŦā§āϏāĻāĻŋ āĻŦāĻŋāϰāĻā§āϤāĻŋāĻāϰ āĻāĻžāĻāĻā§āϞ⧠āĻšā§āϝāĻžāύā§āĻĄāϞ āĻāϰāĻŦā§: āĻā§āϝāĻŧā§āϰāĻŋ āĻāϞ āĻāϰāĻž, ânot foundâ āĻŽā§āϝāĻžāĻĒ āĻāϰāĻž, āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āϰ⧠āĻā§āĻ āĻāϰāĻž, āĻāĻŦāĻ āĻāύāϏāĻŋāϏā§āĻā§āύā§āĻ āĻāϰāϰ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧāĻžāĨ¤\n\n### 4) āĻāύā§āĻāĻŋāĻāĻŋ-āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻ
āĻāĻļāĻā§āϞ⧠āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰā§āύ\n\nāĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋ āϰāĻŋāĻĒā§ āϝāĻž āĻā§āύā§āϰāĻŋāĻ āĻāϰāĻž āϝāĻžāϝāĻŧ āύāĻž āϏā§āĻāĻžāĻ āϏāϰāĻŦāϰāĻžāĻš āĻāϰāĻŦā§:\n\n- list/get/create/update/delete-āĻāϰ SQL\n- scan(row) āĻĢāĻžāĻāĻļāύ āϝāĻž āϰā§āĻā§ E-āϤ⧠āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰā§\n- bind(...) āĻĢāĻžāĻāĻļāύ āϝāĻž āĻā§āϝāĻŧā§āϰāĻŋ āĻāϰā§āĻāϏ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§\n\n### 5) āĻāύāĻā§āϰāĻŋāĻ āϰāĻŋāĻĒā§āĻāϝāĻŧāĻžāĻā§āϞ⧠āĻ āϏāĻžāϰā§āĻāĻŋāϏ⧠āĻāĻā§āϞ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ\n\nNewCustomerRepo(exec Executor) *CustomerRepo āϤā§āϰāĻŋ āĻāϰā§āύ āϝāĻž baseRepo embed āĻŦāĻž wrap āĻāϰā§āĨ¤ āϏāĻžāϰā§āĻāĻŋāϏ āϞā§āϝāĻŧāĻžāϰ Repo[E,K] āĻāύā§āĻāĻžāϰāĻĢā§āϏ⧠āύāĻŋāϰā§āĻāϰ āĻāϰ⧠āĻāĻŦāĻ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύā§āϝāĻŧ āĻāĻāύ āĻā§āϰāĻžāύāĻā§āĻāĻļāύ āĻļā§āϰ⧠āĻāϰāϤ⧠āĻšāĻŦā§; āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻā§āĻŦāϞ āϝ⧠executor āĻĻā§āĻāϝāĻŧāĻž āĻšāϝāĻŧā§āĻā§ āϏā§āĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤\n\n## List/Get/Create/Update/Delete āĻšā§āϝāĻžāύā§āĻĄāϞ āĻāϰāĻž āϝāĻžāϤ⧠āĻāĻžāĻŽā§āϞāĻž āύāĻž āĻāϏā§\n\nāĻā§āύā§āϰāĻŋāĻ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āϤāĻāύāĻ āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰ⧠āϝāĻāύ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŽā§āĻĨāĻĄ āϏāĻŦ āĻāĻžāϝāĻŧāĻāĻžāϝāĻŧ āĻāĻāĻāĻāĻžāĻŦā§ āĻāĻāϰāĻŖ āĻāϰā§āĨ¤ āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āϏāĻŽāϏā§āϝāĻž āĻā§āĻ āĻ
āύāĻŋāϝāĻŧāĻŽ āĻĨā§āĻā§ āĻāϏā§: āĻāĻ āϰāĻŋāĻĒā§ created_at āĻĻāĻŋāϝāĻŧā§ order āĻāϰā§, āĻ
āύā§āϝāĻāĻŋ id āĻĻāĻŋāϝāĻŧā§; āĻāĻāĻāĻŋ nil, nil āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ missing rows-āĻ, āĻ
āύā§āϝāĻāĻŋ āĻāϰāϰ āĻĻā§āϝāĻŧāĨ¤\n\n### List: pagination āĻ ordering āϝāĻžāϤ⧠āĻāĻāĻā§āĻŽ āϏāϰ⧠āύāĻž āϝāĻžāϝāĻŧ\n\nāĻāĻāĻāĻŋ pagination āϏā§āĻāĻžāĻāϞ āĻŦā§āĻā§ āύāĻŋāύ āĻāĻŦāĻ āϤāĻž āϧāĻžāϰāĻžāĻŦāĻžāĻšāĻŋāĻāĻāĻžāĻŦā§ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰā§āύāĨ¤ Offset pagination (limit/offset) āϏāĻŋāĻŽā§āĻĒāϞ āĻāĻŦāĻ āĻ
ā§āϝāĻžāĻĄāĻŽāĻŋāύ āϏā§āĻā§āϰāĻŋāύā§āϰ āĻāύā§āϝ āĻāĻžāϞāĨ¤ Cursor pagination āĻ
āύāύā§āϤ āϏā§āĻā§āϰāϞāĻŋāĻāϝāĻŧā§āϰ āĻāύā§āϝ āĻāĻžāϞā§, āĻāĻŋāύā§āϤ⧠āĻāĻāĻŋ āĻāĻāĻāĻŋ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ sort key āĻāĻžāĻāĨ¤\n\nāϝāĻž āĻāĻŋāĻā§ āĻŦā§āĻā§ āύāĻŋāύ, ordering āϏā§āĻĒāώā§āĻ āĻ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ āϰāĻžāĻā§āύāĨ¤ āĻāĻāύāĻŋāĻ āĻāϞāĻžāĻŽ (āĻĒā§āϰāĻžāĻāĻŽāĻžāϰāĻŋ āĻā§) āĻĻāĻŋāϝāĻŧā§ order āĻāϰāϞ⧠āύāϤā§āύ āϰā§āĻāϰā§āĻĄ āĻāϞ⧠āĻāĻāĻā§āĻŽ āĻĒā§āĻ āĻŦāĻĻāϞ⧠āϝāĻžāĻŦā§ āύāĻžāĨ¤\n\n### Get: āϏā§āĻĒāώā§āĻ ânot foundâ āϏāĻŋāĻāύā§āϝāĻžāϞ\n\nGet(ctx, id) āĻāĻāĻāĻŋ āĻāĻžāĻāĻĒā§āĻĄ āĻāύā§āĻāĻŋāĻāĻŋ āĻ āϏā§āĻĒāώā§āĻ āĻŽāĻŋāϏāĻŋāĻ-āϰā§āĻāϰā§āĻĄ āϏāĻāĻā§āϤ āĻĢā§āϰāϤ āĻĻāĻŋāύ â āϏāĻžāϧāĻžāϰāĻŖāϤ ErrNotFound āĻŽāϤ⧠āĻļā§āϝāĻŧāĻžāϰā§āĻĄ sentinelāĨ¤ āĻļā§āύā§āϝ-āĻŽā§āϞā§āϝ āĻāύā§āĻāĻŋāĻāĻŋ āĻ nil āĻāϰāϰ āĻĢā§āϰāϤ āĻĻāĻŋāϞ⧠āĻāϞāĻžāϰāϰāĻž āĻŦā§āĻāϤ⧠āĻĒāĻžāϰāĻŦā§ āύāĻž âāĻŽāĻŋāϏāĻŋāĻâ āύāĻž âāĻāĻžāϞāĻŋ āĻĢāĻŋāϞā§āĻĄâāĨ¤\n\nāĻāĻžāĻāĻĒ āĻĄā§āĻāĻžāϰ āĻāύā§āϝ, āĻāϰāϰ āϏā§āĻā§āĻā§āϰ āĻāύā§āϝāĨ¤\n\nāĻŽā§āĻĨāĻĄ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰāĻžāϰ āĻāĻā§ āĻāϝāĻŧā§āĻāĻāĻŋ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāύ āĻāĻŦāĻ āϏā§āĻā§āϞ⧠āĻāύāϏāĻŋāϏā§āĻā§āύā§āĻ āϰāĻžāĻā§āύ:\n\n- Create: āĻāĻĒāύāĻŋ āĻāĻŋ āĻāύāĻĒā§āĻ āĻāĻžāĻāĻĒ āύā§āĻŦā§āύ (āĻā§āύ ID, āĻā§āύ timestamps āύāϝāĻŧ) āύāĻžāĻāĻŋ āĻĒā§āϰā§āĻŖ entity? āĻ
āύā§āĻ āĻĻāϞ Create(ctx, in CreateX) āĻĒāĻāύā§āĻĻ āĻāϰ⧠āϝāĻžāϤ⧠āĻāϞāĻžāϰāϰāĻž āϏāĻžāϰā§āĻāĻžāϰ-āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŋāϤ āĻĢāĻŋāϞā§āĻĄ āϏā§āĻ āĻāϰāϤ⧠āύāĻž āĻĒāĻžāϰā§āĨ¤\n- Update: āĻāĻāĻŋ āĻĒā§āϰā§āĻŖ āϰāĻŋāĻĒā§āϞā§āϏ āύāĻžāĻāĻŋ āĻĒā§āϝāĻžāĻ? āĻĒā§āϝāĻžāĻ āĻšāϞ⧠plain struct āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ āύāĻž āϝā§āĻāĻžāύ⧠āĻļā§āύā§āϝ āĻŽāĻžāύ āĻŦāĻŋāĻā§āϰāĻžāύā§āϤāĻŋāĻāϰāĨ¤ āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ, nullable āĻāĻžāĻāĻĒ, āĻŦāĻž explicit field mask āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤\n- Delete: āĻšāĻžāϰā§āĻĄ āĻĄāĻŋāϞā§āĻ āύāĻžāĻāĻŋ āϏāĻĢāĻ āĻĄāĻŋāϞā§āĻ? āϏāĻĢāĻ āĻĄāĻŋāϞā§āĻ āĻšāϞ⧠āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāύ Get āĻĄāĻŋāĻĢāϞā§āĻāĻāĻžāĻŦā§ āĻĄāĻŋāϞā§āĻā§āĻĄ āϏāĻžāϰāĻŋ āϞā§āĻāĻžāĻŦā§ āĻāĻŋ āύāĻžāĨ¤\n\nāϞāĻŋāĻāĻŋāϤ āĻŽā§āĻĨāĻĄāĻā§āϞ⧠āĻā§ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻŦā§ āϤāĻžāĻ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāύāĨ¤ āĻāĻŽ-āĻāĻļā§āĻāϰā§āϝā§āϰ āĻ
āĻĒāĻļāύ āĻšāϞ⧠āĻāĻĒāĻĄā§āĻ āĻšāĻāϝāĻŧāĻž entity āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻž (DB āĻĄāĻŋāĻĢāϞā§āĻāĻā§āϞ⧠āϏāĻš) āĻ
āĻĨāĻŦāĻž āĻļā§āϧā§āĻ ID āĻ ErrNotFound āĻĢā§āϰāϤ āĻāϰāĻž āϝāĻāύ āĻāĻŋāĻā§ āĻŦāĻĻāϞāĻžāϝāĻŧāύāĻŋāĨ¤\n\n## āĻā§āύā§āϰāĻŋāĻ āĻ āĻāύā§āĻāĻŋāĻāĻŋ-āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻ
āĻāĻļā§āϰ āĻā§āϏā§āĻāĻŋāĻ āĻā§āĻļāϞ\n\nāĻāĻ āĻĒāĻĻā§āϧāϤāĻŋ āϤāĻāύāĻ āĻŽā§āϞā§āϝ āĻĻā§āϝāĻŧ āϝāĻāύ āĻŦāĻŋāĻļā§āĻŦāĻžāϏ āĻāϰāĻž āϏāĻšāĻāĨ¤ āĻā§āĻĄ āϝā§āĻŽāύ āĻāĻžāĻ āĻāϰā§āĻā§āύ, āĻā§āϏā§āĻāĻ āϏā§āĻ āϞāĻžāĻāύā§āĻ āĻāĻžāĻ āĻāϰā§āύ: āĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻšā§āϞā§āĻĒāĻžāϰāĻā§āϞ⧠āĻāĻāĻŦāĻžāϰ āĻā§āϏā§āĻ āĻāϰā§āύ, āϤāĻžāϰāĻĒāϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋāϰ SQL āĻ scanning āĻāϞāĻžāĻĻāĻž āĻāϰ⧠āĻā§āϏā§āĻ āĻāϰā§āύāĨ¤\n\nāĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻ
āĻāĻļāĻā§āϞā§āĻā§ āϝāϤāĻāĻž āϏāĻŽā§āĻāĻŦ āĻā§āĻ pure āĻĢāĻžāĻāĻļāύ⧠āϰāĻžāĻā§āύ â pagination validation, sort key-āĻā§ āĻ
āύā§āĻŽā§āĻĻāĻŋāϤ āĻāϞāĻžāĻŽā§ āĻŽā§āϝāĻžāĻĒ āĻāϰāĻž, WHERE āĻĢā§āϰāĻžāĻāĻŽā§āύā§āĻ āĻŦāĻŋāϞā§āĻĄāĻŋāĻ āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤ āĻāĻā§āϞ⧠āĻĻā§āϰā§āϤ āĻāĻāύāĻŋāĻ āĻā§āϏā§āĻ āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻžāϰ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤\n\nList āĻā§āϝāĻŧā§āϰāĻŋāĻĻā§āϰ āĻāύā§āϝ table-driven āĻā§āϏā§āĻ āĻāĻžāϞ⧠āĻāĻžāĻ āĻāϰ⧠āĻāĻžāϰāĻŖ edge case-āĻ āϏāĻŽāϏā§āϝāĻžāĨ¤ āĻāĻžāϞāĻŋ āĻĢāĻŋāϞā§āĻāĻžāϰ, āĻ
āĻāĻžāύāĻž sort key, limit 0, āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻŦā§āĻļāĻŋ limit, negative offset, āĻāĻŦāĻ ânext pageâ āϏā§āĻŽāĻžāύā§āϤ āϝā§āĻāĻžāύ⧠āĻāĻĒāύāĻŋ āĻāĻā§āϏāĻā§āϰāĻž āϰ⧠āĻĢā§āĻ āĻāϰā§āύ â āĻāϏāĻŦ āĻāĻāĻžāϰ āĻāϰā§āύāĨ¤\n\nāĻĒā§āϰāϤāĻŋ-āĻāύā§āĻāĻŋāĻāĻŋāϰ āĻā§āϏā§āĻāĻā§āϞ⧠āĻāύā§āĻāĻŋāĻāĻŋ-āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻā§ āϤāĻž āĻĢā§āĻāĻžāϏ āϰāĻžāĻā§āĻ: āĻāĻĒāύāĻŋ āĻā§āύ SQL āĻāĻļāĻž āĻāϰā§āύ āĻāĻŦāĻ āĻāĻŋāĻāĻžāĻŦā§ āϰ⧠entity-āϤ⧠āϏā§āĻā§āϝāĻžāύ āĻšāϝāĻŧāĨ¤ SQL mock āĻŦāĻž āĻšāĻžāϞāĻāĻž āĻā§āϏā§āĻ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ scanner nulls, optional āĻāϞāĻžāĻŽ, āĻ āĻāĻžāĻāĻĒ āĻāύāĻāĻžāϰāĻļāύ āϏāĻžāĻŽāϞāĻžāϝāĻŧāĨ¤\n\nāĻāĻĒāύāĻžāϰ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ āϝāĻĻāĻŋ āĻā§āϰāĻžāύāĻā§āĻāĻļāύ āϏāĻžāĻĒā§āϰā§āĻ āĻāϰā§, commit/rollback āĻāĻāϰāĻŖ āĻā§āĻ fake executor āĻĻāĻŋāϝāĻŧā§ āĻā§āϏā§āĻ āĻāϰā§āύ āϝ⧠āĻāϞāĻā§āϞ⧠āϰā§āĻāϰā§āĻĄ āĻāϰ⧠āĻāĻŦāĻ āĻāϰāϰ āϏāĻŋāĻŽā§āϞā§āĻ āĻāϰā§: \n\n- Begin āĻāĻāĻāĻŋ tx-scoped executor āϰāĻŋāĻāĻžāϰā§āύ āĻāϰā§\n- āϤā§āϰā§āĻāĻŋāϤ⧠rollback āĻ āĻŋāĻ āĻāĻāĻŦāĻžāϰ āĻāϞ āĻšāϝāĻŧ\n- āϏāĻĢāϞ āĻšāϞ⧠commit āĻ āĻŋāĻ āĻāĻāĻŦāĻžāϰ āĻāϞ āĻšāϝāĻŧ\n- commit āĻŦā§āϝāϰā§āĻĨ āĻšāϞ⧠āĻāϰāϰ āĻ
āĻĒāϰāĻŋāĻŦāϰā§āϤāĻŋāϤ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ\n\nāĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻā§āĻ âcontract testsâ āϝā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻž āĻĒā§āϰāϤāĻŋāĻāĻŋ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāĻā§ āĻĒāĻžāĻļ āĻāϰāϤ⧠āĻšāĻŦā§: create āϤāĻžāϰāĻĒāϰ get āĻāĻāĻ āĻĄā§āĻāĻž, update āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻĢāĻŋāϞā§āĻĄ āĻŦāĻĻāϞāĻžāϝāĻŧ, delete āĻāϰāϞ⧠get ErrNotFound āĻĻā§āϝāĻŧ, āĻāĻŦāĻ list āĻāĻāĻ āĻāύāĻĒā§āĻā§ āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ ordering āĻĻā§āϝāĻŧāĨ¤\n\n## āϏāĻžāϧāĻžāϰāĻŖ āĻā§āϞ āĻ āĻĢāĻžāĻāĻĻ\n\nāĻā§āύā§āϰāĻŋāĻāϏ āĻĻā§āĻā§ āĻ
āύā§āĻā§āĻ āĻāĻāĻāĻž āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻŦāĻžāύāĻŋāϝāĻŧā§ āϏāĻŦāĻāĻŋāĻā§āĻā§ āĻāύā§āĻā§āϰā§āϞ āĻāϰāϤ⧠āĻāĻžāĻāĻŦā§āĨ¤ āĻĄāĻžāĻāĻž āĻ
ā§āϝāĻžāĻā§āϏā§āϏ āĻā§āĻ āĻā§āĻ āĻāĻŋāύā§āύāϤāĻžāϝāĻŧ āĻĒāϰāĻŋāĻĒā§āϰā§āĻŖ, āĻāĻŦāĻ āϏā§āĻ āĻāĻŋāύā§āύāϤāĻžāĻā§āϞ⧠āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖāĨ¤\n\nāĻāĻŋāĻā§ āĻĢāĻžāĻāĻĻ āĻĒā§āϰāĻžāϝāĻŧāĻ āĻĻā§āĻāĻž āϝāĻžāϝāĻŧ:\n\n- āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āϏāĻžāϧāĻžāϰāĻŖāĻāϰāĻŖ āϝā§āĻāĻžāύ⧠āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŽā§āĻĨāĻĄ āĻŦāĻĄāĻŧ āĻ
āĻĒāĻļāύ āĻŦā§āϝāĻžāĻ āύā§āϝāĻŧ (joins, search, permissions, soft deletes, caching)āĨ¤ āϤāĻāύ āĻāĻĒāύāĻŋ āĻāϰā§āĻāĻāĻŋ ORM āĻŦāĻžāύāĻŋāϝāĻŧā§ āĻĢā§āϞā§āĻā§āύāĨ¤\n- āĻā§āĻŦ āĻŦā§āĻĻā§āϧāĻŋāĻŽāĻžāύ āĻāύāϏā§āĻā§āϰā§āĻāύā§āĻāĨ¤ āϝāĻĻāĻŋ āĻĒāĻžāĻ āĻāĻĻā§āϰ āĻāĻžāĻāĻĒ āϏā§āĻ āĻĄāĻŋāĻā§āĻĄ āĻāϰāϤ⧠āĻšāϝāĻŧ āĻŦā§āĻāϤ⧠āϝ⧠āĻāĻāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋ āĻā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§, āϤāĻāύ abstraction-āĻāĻŋ āĻāϰāĻā§āϰ āĻŦā§āĻļāĻŋ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤\n- āĻāύāĻĒā§āĻ āĻāĻžāĻāĻĒāĻā§ DB āĻŽāĻĄā§āϞ āĻšāĻŋāϏā§āĻŦā§ āĻŽāĻžāύāĻžāĨ¤ āϝāĻāύ Create āĻ Update āĻāĻāĻ struct āύā§āϝāĻŧ āϝāĻž āĻāĻĒāύāĻŋ āϰ⧠āĻĨā§āĻā§ āϏā§āĻā§āϝāĻžāύ āĻāϰā§āύ, DB āĻĄāĻŋāĻāĻžāĻāύ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āĻ āĻā§āϏā§āĻā§ āϞāĻŋāĻ āĻāϰ⧠āĻāĻŦāĻ schema āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻ
ā§āϝāĻžāĻĒā§ āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āĻĒāĻĄāĻŧā§āĨ¤\n- List-āĻ āύā§āϰāĻŦā§ āĻāĻāϰāĻŖ: āĻ
āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ sorting, inconsistent defaults, āĻŦāĻž paging āύāĻŋāϝāĻŧāĻŽ āϝāĻž āĻāύā§āĻāĻŋāĻāĻŋ āĻ
āύā§āϝāĻžāϝāĻŧā§ āĻŦāĻĻāϞ⧠āϝāĻžāϝāĻŧāĨ¤\n\nāĻāĻāĻāĻŋ āĻŦāĻžāϏā§āϤāĻŦ āĻāĻĻāĻžāĻšāϰāĻŖ: ListCustomers āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻāĻŋāύā§āύ āĻ
āϰā§āĻĄāĻžāϰ⧠āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠āϝāĻĻāĻŋ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋāĻāĻŋ ORDER BY āύāĻž āĻĻā§āϝāĻŧāĨ¤ āϤāĻāύ pagination āϰā§āĻāϰā§āĻĄ āĻĄā§āĻĒā§āϞāĻŋāĻā§āĻ āĻŦāĻž āϏā§āĻāĻŋāĻĒ āĻāϰā§āĨ¤ ordering āϏā§āĻĒāώā§āĻ āĻāϰā§āύ (āϝāĻĻāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϝāĻŧ āĻļā§āϧā§āĻ āĻĒā§āϰāĻžāĻāĻŽāĻžāϰāĻŋ āĻā§ āĻĻāĻŋāϝāĻŧā§) āĻāĻŦāĻ āĻĄāĻŋāĻĢāϞā§āĻāĻā§āϞ⧠āĻāύāϏāĻŋāϏā§āĻā§āύā§āĻ āϰāĻžāĻā§āύāĨ¤\n\n## āĻā§āϰāĻšāĻŖ āĻāϰāĻžāϰ āĻāĻā§ āĻĻā§āϰā§āϤ āĻā§āĻāϞāĻŋāϏā§āĻ\n\nāĻā§āύā§āϰāĻŋāĻ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻĒā§āϝāĻžāĻā§āĻā§ āϰā§āϞ āĻāĻāĻ āĻāϰāĻžāϰ āĻāĻā§ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ āĻāĻāĻž āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āĻāĻŽāĻžāĻŦā§ āĻāĻŋāύā§āϤ⧠āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻāϰāĻŖ āϞā§āĻāĻžāĻŦā§ āύāĻžāĨ¤\n\nāĻāύāϏāĻŋāϏā§āĻā§āύā§āϏāĻŋ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰā§āύāĨ¤ āĻāĻāĻāĻŋ āϰāĻŋāĻĒā§ context.Context āύā§āϝāĻŧ āĻāϰ āĻ
āύā§āϝāĻāĻŋ āύāĻž āϝāĻĻāĻŋ āĻāĻŽāύ āĻšāϝāĻŧ, āĻ
āĻĨāĻŦāĻž āĻāĻāĻāĻŋ (T, error) āϰāĻŋāĻāĻžāϰā§āύ āĻāϰ⧠āĻāϰ āĻ
āύā§āϝāĻāĻŋ (*T, error) â āĻāϏāĻŦ āĻ
āϏāĻžāĻŽāĻā§āĻāϏā§āϝ āϏāĻžāϰā§āĻāĻŋāϏ, āĻā§āϏā§āĻ, āĻ āĻŽāĻ-āĻ āϏāĻŽāϏā§āϝāĻž āϤā§āϰāĻŋ āĻāϰā§āĨ¤\n\nāĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋāϰ āĻāύā§āϝ āĻāϞā§āĻĒā§ āĻāĻāĻāĻŋ āϏā§āĻĒāώā§āĻ āĻŦāĻžāĻĄāĻŧāĻŋ āϰāĻžāĻā§āύ āϝā§āĻāĻžāύ⧠SQL āĻĨāĻžāĻā§āĨ¤ āĻā§āύā§āϰāĻŋāĻ āĻā§āĻĄ āĻĢā§āϞ⧠reuse āĻāϰā§āĻ (scan, validate, map errors), āĻāĻŋāύā§āϤ⧠āĻā§āϝāĻŧā§āϰāĻŋ āϏā§āĻā§āϰāĻŋāĻ āĻā§āĻāϰ⧠āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āύāĻž āĻĒāĻĄāĻŧā§āĻāĨ¤\n\nāĻāĻāĻāĻŋ āĻĻā§āϰā§āϤ āĻā§āĻā§āϰ āϏā§āĻ āϝāĻž āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻŦāĻŋāϏā§āĻŽāϝāĻŧ āĻĒā§āϰāϤāĻŋāϰā§āϧ āĻāϰā§:\n\n- List/Get/Create/Update/Delete-āĻāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻŋāĻāύā§āĻāĻžāϰ āĻāύāĻā§āύāĻļāύ\n- āĻĒā§āϰāϤāĻŋāĻāĻŋ āϰāĻŋāĻĒā§āϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻ āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ not-found āύāĻŋāϝāĻŧāĻŽ\n- āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ list ordering āϝāĻž āĻĄāĻā§āĻŽā§āύā§āĻā§āĻĄ āĻ āĻā§āϏā§āĻ āĻāϰāĻž āĻāĻā§\n- *sql.DB āĻ *sql.Tx āĻāĻāĻ āĻā§āĻĄā§ āĻāĻžāϞāĻžāύā§āϰ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻāĻĒāĻžāϝāĻŧ (executor āĻāύā§āĻāĻžāϰāĻĢā§āϏ)\n- āĻā§āύā§āϰāĻŋāĻ āĻā§āĻĄ āĻ āĻāύā§āĻāĻŋāĻāĻŋ āύāĻŋāϝāĻŧāĻŽā§āϰ āĻŽāϧā§āϝ⧠āĻĒāϰāĻŋāώā§āĻāĻžāϰ āϏā§āĻŽāĻžāύāĻž (āĻā§āϝāĻžāϞāĻŋāĻĄā§āĻļāύ āĻ āĻŦāĻŋāĻāύā§āϏ āĻā§āĻ āĻā§āύā§āϰāĻŋāĻ āϏā§āϤāϰā§āϰ āĻŦāĻžāĻāϰ⧠āϰāĻžāĻā§āύ)\n\nāĻāĻĒāύāĻŋ āϝāĻĻāĻŋ AppMaster-āĻ āĻĻā§āϰā§āϤāĻ āĻ
āĻā§āϝāύā§āϤāϰā§āĻŖ āĻā§āϞ āĻŦāĻžāύāĻžāĻā§āĻā§āύ āĻāĻŦāĻ āĻĒāϰ⧠āĻā§āύāĻžāϰā§āĻā§āĻĄ Go āĻā§āĻĄ āĻāĻā§āϏāĻĒā§āϰā§āĻ āĻŦāĻž āĻŦā§āĻĻā§āϧāĻŋ āĻāϰāĻā§āύ, āĻāĻ āĻā§āĻāĻā§āϞ⧠āĻĄā§āĻāĻž āϞā§āϝāĻŧāĻžāϰāĻā§ āĻĒā§āϰā§āĻŦāĻžāύā§āĻŽāĻžāύāϝā§āĻā§āϝ āĻ āĻā§āϏā§āĻ āĻāϰāĻž āϏāĻšāĻ āϰāĻžāĻāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤\n\n## āĻŦāĻžāϏā§āϤāĻŦ āĻāĻĻāĻžāĻšāϰāĻŖ: āĻāĻāĻāĻŋ Customer āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āϤā§āϰāĻŋ āĻāϰāĻž\n\nāύāĻŋāĻā§ āĻāĻāĻāĻŋ āĻā§āĻ Customer āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āϰā§āĻĒ āϝāĻž āĻāĻžāĻāĻĒ-āϏā§āĻĢ āϰā§āĻā§ āĻŦā§āĻļ āϏāϰāϞāĨ¤\n\nāϏā§āĻā§āϰāĻĄ āĻŽāĻĄā§āϞ āĻĻāĻŋāϝāĻŧā§ āĻļā§āϰ⧠āĻāϰā§āύāĨ¤ ID āĻļāĻā§āϤ āĻāĻžāĻāĻĒ āĻāϰāĻž āϰāĻžāĻā§āύ āϝāĻžāϤ⧠āĻā§āϞ ID āĻŽāĻŋāĻļā§ āύāĻž āϝāĻžāϝāĻŧ:\n\ngo\ntype CustomerID int64\n\ntype Customer struct {\n\tID CustomerID\n\tName string\n\tStatus string // "active", "blocked", "trial"...\n}\n\n\nāĻāĻāύ âAPI āĻāĻŋ āύā§āϝāĻŧâ āĻāĻŦāĻ âāĻāĻĒāύāĻŋ āĻāĻŋ āϏā§āĻā§āϰ āĻāϰā§āύâ āĻāϞāĻžāĻĻāĻž āĻāϰā§āύāĨ¤ Create āĻ Update āĻāĻāĻžāύ⧠āĻāϞāĻžāĻĻāĻž āĻšāĻāϝāĻŧāĻž āĻāĻāĻŋāϤāĨ¤\n\ngo\ntype CreateCustomerInput struct {\n\tName string\n\tStatus string\n}\n\ntype UpdateCustomerInput struct {\n\tName *string\n\tStatus *string\n}\n\n\nāĻāĻĒāύāĻžāϰ āĻā§āύā§āϰāĻŋāĻ āĻŦā§āϏ āĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻĢā§āϞ⧠(āĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāϞāĻžāύā§, āϏā§āĻā§āϝāĻžāύ, āĻāϰāϰ āĻŽā§āϝāĻžāĻĒāĻŋāĻ) āĻšā§āϝāĻžāύā§āĻĄāϞ āĻāϰāĻŦā§, āĻāϰ Customer repo Customer-āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ SQL āĻ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āĻĻā§āĻāĻŦā§āĨ¤ āϏāĻžāϰā§āĻāĻŋāϏ āϞā§āϝāĻŧāĻžāϰā§āϰ āĻĻā§āώā§āĻāĻŋāϤ⧠āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻĨāĻžāĻāĻŦā§:\n\ngo\ntype CustomerRepo interface {\n\tCreate(ctx context.Context, in CreateCustomerInput) (Customer, error)\n\tUpdate(ctx context.Context, id CustomerID, in UpdateCustomerInput) (Customer, error)\n\tGet(ctx context.Context, id CustomerID) (Customer, error)\n\tDelete(ctx context.Context, id CustomerID) error\n\tList(ctx context.Context, q CustomerListQuery) ([]Customer, int, error)\n}\n\n\nList-āĻāϰ āĻāύā§āϝ, āĻĢāĻŋāϞā§āĻāĻžāϰ āĻ pagination āĻā§ āĻĢāĻžāϰā§āϏā§āĻ-āĻā§āϞāĻžāϏ āĻ
āύā§āϰā§āϧ āĻ
āĻŦāĻā§āĻā§āĻ āĻšāĻŋāϏā§āĻŦā§ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰā§āύāĨ¤ āĻāĻāĻŋ āĻāϞ āϏāĻžāĻāĻāĻā§āϞā§āĻā§ āĻĒāĻĄāĻŧāϤ⧠āϏāĻšāĻ āϰāĻžāĻā§ āĻāĻŦāĻ āϞāĻŋāĻŽāĻŋāĻ āĻā§āϞ⧠āϝāĻžāĻāϝāĻŧāĻž āĻāĻ āĻŋāύ āĻāϰ⧠āĻĻā§āϝāĻŧāĨ¤\n\ngo\ntype CustomerListQuery struct {\n\tStatus *string // filter\n\tSearch *string // name contains\n\tLimit int\n\tOffset int\n}\n\n\nāĻāĻāĻžāύ āĻĨā§āĻā§ āĻĒā§āϝāĻžāĻāĻžāϰā§āύāĻāĻŋ āĻāĻžāϞā§āĻāĻžāĻŦā§ āϏā§āĻā§āϞ āĻāϰā§: āĻĒāϰā§āϰ āĻāύā§āĻāĻŋāĻāĻŋāϰ āĻāύā§āϝ āĻāĻāĻ āϏā§āĻā§āϰāĻžāĻāĻāĻžāϰ āĻ
āύā§āϞāĻŋāĻĒāĻŋ āĻāϰā§āύ, āĻāύāĻĒā§āĻ āϏā§āĻā§āϰāĻĄ āĻŽāĻĄā§āϞ āĻĨā§āĻā§ āĻāϞāĻžāĻĻāĻž āϰāĻžāĻā§āύ, āĻāĻŦāĻ āϏā§āĻā§āϝāĻžāύāĻŋāĻ āϏā§āĻĒāώā§āĻ āϰāĻžāĻā§āύ āϝāĻžāϤ⧠āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻā§āϞ⧠āϏā§āĻŦāĻā§āĻ āĻ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ-āϏāĻšāĻžāϝāĻŧāĻŋāϤ āĻĨāĻžāĻā§āĨ¤
āĻĒā§āϰāĻļā§āύā§āϤā§āϤāϰ
āĻā§āύā§āϰāĻŋāĻāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻŋ āĻā§āĻŦāϞ āĻĒā§āϰāĻŦāĻžāĻšāĻāĻŋāĻ āĻĒā§āύāĻāĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦā§āύ (āĻā§āϝāĻŧā§āϰāĻŋ āĻāĻžāϞāĻžāύā§, āϰ⧠āϞā§āĻĒ, not-found āĻšā§āϝāĻžāύā§āĻĄāϞāĻŋāĻ, pagination āĻĄāĻŋāĻĢāϞā§āĻ, āĻāϰāϰ āĻŽā§āϝāĻžāĻĒāĻŋāĻ) â āĻāĻŋāύā§āϤ⧠āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋāϰ SQL āĻ āϰ⧠āĻŽā§āϝāĻžāĻĒāĻŋāĻ āϏā§āĻĒāώā§āĻāĻāĻžāĻŦā§ āĻāϞāĻžāĻĻāĻž āϰāĻžāĻāĻŦā§āύāĨ¤ āĻāϤ⧠āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋ āĻāĻŽāĻŦā§ āĻāĻŋāύā§āϤ⧠āĻĄā§āĻāĻž āϞā§āϝāĻŧāĻžāϰ runtime-āĻ āĻ āĻĻā§āĻļā§āϝ âāĻŽā§āϝāĻžāĻāĻŋāĻâ āĻšāϝāĻŧā§ āϝāĻžāĻŦā§ āύāĻžāĨ¤
āϰāĻŋāĻĢā§āϞā§āĻāĻļāύ āĻŽā§āϝāĻžāĻĒāĻŋāĻ āύāĻŋāϝāĻŧāĻŽāĻā§āϞ⧠āϞā§āĻāĻŋāϝāĻŧā§ āĻĻā§āϝāĻŧ āĻāĻŦāĻ āĻŦā§āϝāϰā§āĻĨāϤāĻž runtime-āĻ āĻāϞ⧠āϝāĻžāϝāĻŧāĨ¤ āĻāĻŽā§āĻĒāĻžāĻāϞāĻžāϰ āĻā§āĻ āĻāϞ⧠āϝāĻžāϝāĻŧ, IDE āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāĻŽā§ āϝāĻžāϝāĻŧ, āĻāϰ āĻā§āĻ schema āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻā§āϞ⧠āĻāĻāĻŽāĻāĻž āϏāĻŽāϏā§āϝāĻžāϰ āĻāĻžāϰāĻŖ āĻšāϝāĻŧā§ āĻāĻ ā§āĨ¤ āĻā§āύā§āϰāĻŋāĻāϏā§āϰ āϏāĻā§āĻā§ āϏā§āĻĒāώā§āĻ scanner āĻĢāĻžāĻāĻļāύ āϰāĻžāĻāϞ⧠āĻāĻžāĻāĻĒ āϏā§āĻĢāĻāĻŋ āĻŦāĻāĻžāϝāĻŧ āĻĨāĻžāĻā§ āĻāĻŦāĻ āĻāĻāĻ āϏāĻŽāϝāĻŧā§ ë°ëŗĩ āĻ āĻāĻļāĻā§āϞ⧠āĻļā§āϝāĻŧāĻžāϰ āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
āϏāĻžāϧāĻžāϰāĻŖāϤ comparable āĻāĻžāϞ āĻĄāĻŋāĻĢāϞā§āĻ āĻāĻžāϰāĻŖ ID-āĻā§āϞ⧠āϤā§āϞāύāĻž āĻāϰāĻž āĻšāϝāĻŧ, map-āĻāϰ āĻā§ āĻšāĻŋāϏā§āĻŦā§ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻšāϝāĻŧ āĻāĻŦāĻ āĻŦāĻžāϰāĻŦāĻžāϰ āĻĒāĻžāϏ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āϝāĻĻāĻŋ āĻāĻĒāύāĻžāϰ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻŦāĻŋāĻāĻŋāύā§āύ ID āϏā§āĻāĻžāĻāϞ āĻĨāĻžāĻā§ (āϝā§āĻŽāύ int64 āĻ UUID string), āϤāĻžāĻšāϞ⧠ID āĻāĻžāĻāĻĒ āĻā§āύā§āϰāĻŋāĻ āϰāĻžāĻāĻž āĻāĻžāϞ⧠āϝāĻžāϤ⧠āĻāĻāĻāĻŋ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āϏāĻŦ āϰā§āĻĒā§āϤ⧠āĻā§āϰ āύāĻž āĻāϰāĻž āĻšāϝāĻŧāĨ¤
āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻā§āĻŦāϞ āϏā§āĻ āĻāĻŋāύāĻŋāϏāĻā§āϞā§āĻ āĻĻāĻžāĻŦāĻŋ āĻāϰāĻŦā§ āϝāĻž āĻļā§āϝāĻŧāĻžāϰā§āĻĄ CRUD āĻĢā§āϞā§-āĻā§ āĻĻāϰāĻāĻžāϰ, āϏāĻžāϧāĻžāϰāĻŖāϤ GetID() āĻ SetID()āĨ¤ struct embedding āĻŦāĻž āĻāĻāĻŋāϞ type-set āĻā§āϰāĻŋāĻāϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĢāĻŋāϞā§āĻĄ āĻŦāĻžāϧā§āϝ āĻāϰāĻž āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āĻāϞā§āύ â āϤāĻž āĻāĻĒāύāĻžāϰ āĻĄā§āĻŽā§āĻāύ āĻāĻžāĻāĻĒāĻā§āϞā§āĻā§ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĒā§āϝāĻžāĻāĻžāϰā§āύ⧠āĻŦā§āĻāϧ⧠āĻĻā§āĻŦā§āĨ¤
āĻāĻāĻāĻŋ āĻā§āĻ executor āĻāύā§āĻāĻžāϰāĻĢā§āϏ (āϝā§āĻŽāύ DBTX) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āϝāĻžāϤ⧠āĻļā§āϧā§āĻŽāĻžāϤā§āϰ āĻāĻĒāύāĻžāϰ āĻĄāĻžāĻāĻž āĻŽā§āĻĨāĻĄāĻā§āϞ⧠āĻĨāĻžāĻā§, āϝā§āĻŽāύ QueryContext, QueryRowContext, ExecContextāĨ¤ āϤāĻāύ *sql.DB āĻŦāĻž *sql.Tx āϝ⧠āĻā§āύā§āĻāĻŋ executor āĻšāĻŋāϏā§āĻŦā§ āĻĒāĻžāϏ āĻāϰāĻž āϝāĻžāĻŦā§ āĻāĻŦāĻ āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻā§āĻĄā§ āĻļāĻžāĻāĻž-āĻŦāĻŋāĻāĻžāĻ āϝā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§ āύāĻžāĨ¤
Get(ctx, id) āĻāĻžāĻāĻĒā§āĻĄ āĻāύā§āĻāĻŋāĻāĻŋ āĻāĻŦāĻ āϏā§āĻĒāώā§āĻ āĻŽāĻŋāϏāĻŋāĻ-āϰā§āĻāϰā§āĻĄ āϏāĻāĻā§āϤ āĻĢā§āϰāϤ āĻĻā§āϝāĻŧ â āϏāĻžāϧāĻžāϰāĻŖāϤ āĻļā§āϝāĻŧāĻžāϰā§āĻĄ sentinel āĻāϰāϰ āϝā§āĻŽāύ ErrNotFoundāĨ¤ āĻļā§āύā§āϝ-āĻŽā§āϞā§āϝ āĻāύā§āĻāĻŋāĻāĻŋ āĻ nil āĻāϰāϰ āĻĢā§āϰāϤ āĻĻāĻŋāϞ⧠āĻāϞāĻžāϰāϰāĻž āĻŦā§āĻāϤ⧠āĻĒāĻžāϰ⧠āύāĻž āϝ⧠āϰā§āĻāϰā§āĻĄāĻāĻŋ āύā§āĻ āύāĻžāĻāĻŋ āĻļā§āϧ⧠āĻĢāĻŋāϞā§āĻĄāĻā§āϞ⧠āĻāĻžāϞāĻŋāĨ¤
āĻāύāĻĒā§āĻāĻā§āϞā§āĻā§ āϏā§āĻā§āϰ āĻāϰāĻž āĻŽāĻĄā§āϞ āĻĨā§āĻā§ āĻāϞāĻžāĻĻāĻž āϰāĻžāĻā§āύāĨ¤ āĻĒā§āϰāĻžāϝāĻŧāĻļāĻ Create(ctx, CreateInput) āĻ Update(ctx, id, UpdateInput) āĻŦā§āĻļāĻŋ āύāĻŋāϰāĻžāĻĒāĻĻ â āĻāϤ⧠āĻāϞāĻžāϰāϰāĻž āϏāĻžāϰā§āĻāĻžāϰ-āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŋāϤ āĻĢāĻŋāϞā§āĻĄ (ID, timestamps) āύāĻŋāĻā§ āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āύāĻžāĨ¤ āĻĒā§āϝāĻžāĻ-āϏā§āĻāĻžāĻāϞ āĻāĻĒāĻĄā§āĻ āĻšāϞ⧠āĻĒāϝāĻŧā§āύā§āĻāĻžāϰ āĻŦāĻž nullable āĻāĻžāĻāĻĒ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύ āϝāĻžāϤ⧠âāĻ
āϏā§āĻâ āĻ âāĻļā§āύā§āϝāϤ⧠āϏā§āĻâ āĻāϞāĻžāĻĻāĻž āĻāϰāĻž āϝāĻžāϝāĻŧāĨ¤
āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āϏā§āĻĒāώā§āĻ, āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ ORDER BY āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰā§āύ, āϏāĻŽā§āĻāĻŦ āĻšāϞ⧠āĻāĻāύāĻŋāĻ āĻāϞāĻžāĻŽ (āĻĒā§āϰāĻžāĻāĻŽāĻžāϰāĻŋ āĻā§) āĻĻāĻŋāϝāĻŧā§āĨ¤ āύāĻž āĻšāϞ⧠āύāϤā§āύ āϰā§āĻāϰā§āĻĄ āĻāϞ⧠āĻŦāĻž āĻĒā§āϞā§āϝāĻžāύāĻžāϰ āĻŦāĻĻāϞāĻžāϞ⧠pagination-āĻ āĻāĻāĻā§āĻŽāĻā§āϞ⧠āϞāĻžāĻĢāĻŋāϝāĻŧā§ āĻĒāĻĄāĻŧāĻŦā§ āĻŦāĻž āĻāĻĒāĻŋ/āϏā§āĻāĻŋāĻĒ āĻšāĻŦā§āĨ¤
āϰāĻŋāĻĒā§āĻāĻŋāĻāϰāĻŋ āĻĨā§āĻā§ āϏāĻžāϰā§āĻāĻŋāϏāĻā§āϞā§āĻā§ āϝ⧠āĻāϰāϰāĻā§āϞā§āϤ⧠āĻļāĻžāĻāĻž āĻāϰāĻž āĻāĻāĻŋāϤ āϤāĻž āϏā§āĻŽāĻŋāϤ āϰāĻžāĻā§āύ, āϝā§āĻŽāύ ErrNotFound āĻ ErrConflictāĨ¤ āĻŦāĻžāĻāĻŋ āϏāĻŦāĻāĻŋāĻā§ low-level āĻāϰāϰ āĻšāĻŋāϏā§āĻŦā§ context-āϏāĻš wrap āĻāϰā§āύāĨ¤ āĻāϞāĻžāϰāϰāĻž string parse āĻāϰ⧠āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύā§āĻŦā§ āύāĻž â errors.Is āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻļāĻžāĻāĻž āĻāϰāĻž āϝāĻžāĻŦā§āĨ¤
āĻļā§āϝāĻŧāĻžāϰā§āĻĄ āĻšā§āϞā§āĻĒāĻžāϰāĻā§āϞ⧠āĻāĻāĻŦāĻžāϰ āĻāĻāύāĻŋāĻ āĻā§āϏā§āĻ āĻāϰā§āύ (pagination normalization, not-found mapping, affected-row checks) āĻāĻŦāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāύā§āĻāĻŋāĻāĻŋāϰ SQL āĻ scanning āĻāϞāĻžāĻĻāĻž āĻāϰ⧠āĻā§āϏā§āĻ āĻāϰā§āύāĨ¤ āĻā§āĻ contract tests āϰāĻžāĻā§āύ: createâget āĻŽāĻŋāϞāĻā§, update āĻĒā§āϰāϤā§āϝāĻžāĻļāĻŋāϤ āĻĢāĻŋāϞā§āĻĄ āĻŦāĻĻāϞāĻžāϝāĻŧ, delete āĻĒāϰ⧠ErrNotFound āĻāϏā§, list ordering āϏā§āĻĨāĻŋāϤāĻŋāĻļā§āϞ āĻāϤā§āϝāĻžāĻĻāĻŋāĨ¤


