[{"data":1,"prerenderedAt":942},["ShallowReactive",2],{"author-cedric-nicoloso":3,"author-articles-cedric-nicoloso":22,"authors":626},{"id":4,"title":5,"body":6,"description":10,"extension":13,"meta":14,"name":15,"navigation":16,"path":17,"readingTime":18,"seo":19,"stem":20,"__hash__":21},"authors\u002Fauthors\u002Fcedric-nicoloso.md","Engineering Manager",{"type":7,"value":8,"toc":9},"minimark",[],{"title":10,"searchDepth":11,"depth":11,"links":12},"",2,[],"md",{},"Cédric Nicoloso",true,"\u002Fauthors\u002Fcedric-nicoloso",1,{"title":5,"description":10},"authors\u002Fcedric-nicoloso","ibSoh4VZYiWYTuLOnZTedaAfcnvet1Q9H7ogW0LgorY",[23],{"id":24,"title":25,"author":26,"body":27,"date":615,"description":616,"extension":13,"lang":617,"meta":618,"navigation":16,"path":619,"published":16,"readingTime":620,"seo":621,"stem":622,"tags":623,"__hash__":625},"articles\u002Farticles\u002F2022-01-10-prisma-to-interact-with-my-db.md","Prisma to interact with my DB","cedric-nicoloso",{"type":7,"value":28,"toc":596},[29,41,56,72,77,85,91,94,99,108,113,117,126,131,135,138,143,153,180,187,194,197,201,208,213,218,221,224,229,232,252,258,261,266,270,277,282,285,288,302,306,316,321,332,337,350,356,361,364,369,373,376,390,397,401,404,414,420,423,428,431,436,443,447,460,463,468,475,479,482,494,503,507,510,527,536,539,543,571,575,582,589],[30,31,32,33,40],"p",{},"This post was initially published on\n",[34,35,39],"a",{"href":36,"rel":37},"https:\u002F\u002Fmedium.com\u002F@cedric25\u002Fprisma-to-interact-with-my-db-13da91562600",[38],"nofollow","Medium",".",[30,42,43,44,49,50,55],{},"I’ve been using ",[34,45,48],{"href":46,"rel":47},"https:\u002F\u002Fwww.prisma.io\u002F",[38],"Prisma"," for a few months, and I’ve recently\ngiven ",[34,51,54],{"href":52,"rel":53},"https:\u002F\u002Fwww.meetup.com\u002Ffr-FR\u002FLyonJS\u002Fevents\u002F279341192\u002F",[38],"a talk"," about it, let’s try to recap\nsome takeaways here.",[30,57,58,62,63,70],{},[59,60,61],"em",{},"You might prefer to go over the slides,"," ",[34,64,67],{"href":65,"rel":66},"https:\u002F\u002Fprisma-talk.netlify.app\u002F1",[38],[59,68,69],{},"here you go",[59,71,40],{},[73,74,76],"h2",{"id":75},"interacting-with-my-database","Interacting with my database",[30,78,79,80,84],{},"Prisma belongs to the ORM family (Object-Relational Mapping). It can be seen as an extra layer\nbetween your server and your database and its goal is to ",[81,82,83],"strong",{},"facilitate your job"," each time you want\nto interact with your DB.",[30,86,87],{},[88,89],"img",{"alt":10,"src":90},"\u002Fimages\u002F6ba03-1gwwpv7yl4sk9p9hfu_vkfw.png",[30,92,93],{},"Depending on your project, using this extra layer can bring you some benefits, but there are at\nleast two other ways to interact with your database:",[95,96,98],"h3",{"id":97},"option-1-native-driver","Option 1. Native driver",[30,100,101,102,107],{},"As I’m using PostgreSQL, it would be ",[34,103,106],{"href":104,"rel":105},"https:\u002F\u002Fgithub.com\u002Fbrianc\u002Fnode-postgres",[38],"node-postgres",". By\nchoosing this solution, you will be in total control of the SQL sent to your database, and you’ll\nend up writing your queries like this:",[30,109,110],{},[88,111],{"alt":10,"src":112},"\u002Fimages\u002Fb8c00-1lv624quk0uttk2qvdnsozg.png",[95,114,116],{"id":115},"option-2-a-query-builder","Option 2. A query builder",[30,118,119,120,125],{},"A query builder will help you catch some typos and even more if you’re using TypeScript. The most\npopular one is ",[34,121,124],{"href":122,"rel":123},"https:\u002F\u002Fknexjs.org\u002F",[38],"knex",", and you’ll end up expressing your queries using their\n“helper” functions. Here is a simple example:",[30,127,128],{},[88,129],{"alt":10,"src":130},"\u002Fimages\u002Fabb7d-1747_4h1hahhsfkfl3ttndw.png",[95,132,134],{"id":133},"option-3-a-complete-and-full-featured-framework","Option 3. A complete and full-featured framework",[30,136,137],{},"Here are some we can think of.",[30,139,140],{},[88,141],{"alt":10,"src":142},"\u002Fimages\u002Fd8e77-1im1hvf6fs4nlhxg9j7hdya.png",[30,144,145,148,149,152],{},[59,146,147],{},"Note:"," Some of these tools use ",[150,151,124],"code",{}," as a query builder under the hood.",[30,154,155,158,159,164,165,169,170,173,174,179],{},[81,156,157],{},"Package scores"," come from ",[34,160,163],{"href":161,"rel":162},"https:\u002F\u002Fsnyk.io\u002Fadvisor\u002F",[38],"snyk.io"," (example\nfor ",[34,166,48],{"href":167,"rel":168},"https:\u002F\u002Fsnyk.io\u002Fadvisor\u002Fnpm-package\u002Fprisma",[38],"), they take into account a few aspects such\nas popularity, maintenance, security and community. I don’t know what it’s worth but at least it\ngives another metric along with Github stars (",[59,171,172],{},"which is not a real metric, yes you’re right","). You\ncan also check ",[34,175,178],{"href":176,"rel":177},"https:\u002F\u002Fmoiva.io\u002F?npm=prisma+sequelize+typeorm",[38],"moiva.io"," 📊.",[30,181,182,183],{},"Comparing these frameworks is not an easy job (unless you have unlimited time to try them all!). The\nfollowing article helped me get a better idea of each of\nthem: ",[34,184,185],{"href":185,"rel":186},"https:\u002F\u002Fwww.sitepoint.com\u002Fjavascript-typescript-orms\u002F",[38],[30,188,189,190],{},"Prisma team also did a good job comparing SQL, query builders, and\nORMs: ",[34,191,192],{"href":192,"rel":193},"https:\u002F\u002Fwww.prisma.io\u002Fdataguide\u002Ftypes\u002Frelational\u002Fcomparing-sql-query-builders-and-orms",[38],[30,195,196],{},"Long story short, I went on with Prisma.",[73,198,200],{"id":199},"our-database-schema","Our database schema",[30,202,203,204,207],{},"Let’s get to it. The first thing we notice when starting with Prisma is the schema we have to\ndefine. It uses ",[81,205,206],{},"a specific syntax"," and it goes something like this:",[30,209,210],{},[59,211,212],{},"(Prisma 2 syntax here, see next screenshot for Prisma ≥ v3)",[30,214,215],{},[88,216],{"alt":10,"src":217},"\u002Fimages\u002F4a34b-1ps0niaccnkjkzlmztrnhdq.png",[30,219,220],{},"Most of it should be self-explanatory 🤞.",[30,222,223],{},"Here is Prisma v3 equivalent:",[30,225,226],{},[88,227],{"alt":10,"src":228},"\u002Fimages\u002Fea891-11v4g8nvu4jlw2ndvart25q.png",[30,230,231],{},"Then to inject this structure to your database, you’ll need to:",[233,234,235,243,246],"ul",{},[236,237,238,239,242],"li",{},"Set the value of the environment variable ",[150,240,241],{},"DATABASE_URL",";",[236,244,245],{},"Have a database that listens to this URL, obviously;",[236,247,248,249],{},"Run the following Prisma CLI command: ",[150,250,251],{},"prisma db push",[30,253,254,255,40],{},"Good news if you already have an existing project and your database structure in place, you can\ninfer this schema with ",[150,256,257],{},"prisma db pull",[30,259,260],{},"To recap:",[30,262,263],{},[88,264],{"alt":10,"src":265},"\u002Fimages\u002Ff6e3f-1lojerdqtz6cyj4rs8izsoa.png",[95,267,269],{"id":268},"schema-in-other-orms","Schema in other ORMs",[30,271,272,273,276],{},"You might have used ORMs before. I personally remember Hibernate in Java, it was\nusing ",[81,274,275],{},"annotations"," on top of class attributes. In the JavaScript world, TypeORM follows the same\nidea:",[30,278,279],{},[88,280],{"alt":10,"src":281},"\u002Fimages\u002F3514e-1itkyplkaoifnz3jdv8agtg.png",[30,283,284],{},"So that is a big difference with Prisma.",[30,286,287],{},"Very subjective opinion, but I really like that Prisma does not force me to express my entities as\nJavaScript classes. Since it uses a separate file to define the schema, it serves as a better\nseparation between two worlds: the relational world and the object-oriented world.",[30,289,290,291,296,297,40],{},"To go further on that subject, you can read about\nthe ",[34,292,295],{"href":293,"rel":294},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002Fobject-relational_impedance_mismatch",[38],"object-relational impedance mismatch"," or\nwhat the Prisma\nteam ",[34,298,301],{"href":299,"rel":300},"https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Fconcepts\u002Foverview\u002Fprisma-in-your-stack\u002Fis-prisma-an-orm",[38],"says about it",[73,303,305],{"id":304},"generate-prisma-db-client","Generate Prisma DB client",[30,307,308,309,312,313],{},"Now that we have our database schema all described in a ",[150,310,311],{},"prisma\u002Fschema.prisma"," file, we can ask\nPrisma CLI to generate our DB client: ",[150,314,315],{},"prisma generate",[30,317,318],{},[88,319],{"alt":10,"src":320},"\u002Fimages\u002F3f40e-1gzlsm-u2rgjudneztvs8gw.png",[30,322,323,324,327,328,331],{},"We end up with ",[81,325,326],{},"two new files"," within our ",[150,329,330],{},"node_modules"," folder:",[30,333,334],{},[81,335,336],{},"👉 index.js",[30,338,339,342,343,342,346,349],{},[150,340,341],{},"findFirst()",", ",[150,344,345],{},"findMany()",[150,347,348],{},"updateOne()",", etc.",[30,351,352,353,40],{},"We find in this file all necessary helper functions that we’ll use to write queries. These will\nalways return JavaScript objects (POJOs). And for edge cases, like when you want to take advantage\nof some PostgreSQL extensions, we still can write raw SQL\nqueries: ",[150,354,355],{},"prismaClient.$queryRaw('\u003CSQL>')",[30,357,358],{},[81,359,360],{},"👉 index.d.ts",[30,362,363],{},"All TypeScript types corresponding to our entities. Some basic examples:",[30,365,366],{},[88,367],{"alt":10,"src":368},"\u002Fimages\u002F81530-1erm3iwoqurdmgiu91vxzww.png",[73,370,372],{"id":371},"use-prisma-db-client","Use Prisma DB client",[30,374,375],{},"Now that our DB client has been generated, let’s use it into our app.",[377,378,379,384],"figure",{},[30,380,381],{},[88,382],{"alt":10,"src":383},"\u002Fimages\u002Fa4454-1hocosdbkzhv9vgnzxytj_w.png",[385,386,387],"figcaption",{},[30,388,389],{},"Basic example of using the newly generated Prisma client",[30,391,392,393,396],{},"In a more serious project, you might want to instantiate your Prisma client only once and then\nuse ",[81,394,395],{},"dependency injection"," to pull it wherever you need.",[73,398,400],{"id":399},"tests","Tests",[30,402,403],{},"Two solutions are documented: (I haven’t tried the first one.)",[30,405,406,409,410],{},[81,407,408],{},"1."," By completely mocking Prisma\nclient: ",[34,411,412],{"href":412,"rel":413},"https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Fguides\u002Ftesting\u002Funit-testing",[38],[30,415,416,419],{},[81,417,418],{},"2."," By using a test database:",[30,421,422],{},"Prior to your test script, be sure to set a different database URL:",[30,424,425],{},[150,426,427],{},"DATABASE_URL=postgresql:\u002F\u002Ftest-user:test-password@localhost:5432\u002Fdb-test",[30,429,430],{},"And then clean all tables between each test:",[30,432,433],{},[150,434,435],{},"TRUNCATE TABLE \\\"${dbSchemaName}\\\".\\\"${tablename}\\\" CASCADE;",[30,437,438,439],{},"You can find more info\nhere: ",[34,440,441],{"href":441,"rel":442},"https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Fconcepts\u002Fcomponents\u002Fprisma-client\u002Fcrud#deleting-all-data-with-raw-sql--truncate",[38],[73,444,446],{"id":445},"prisma-migration-tool","Prisma migration tool",[30,448,449,450,455,456,459],{},"Migrations are one of the big subjects you’ll have to deal with during your development phase.\nPrisma won’t be your silver bullet, you will still need to gain knowledge about good practices\n(",[34,451,454],{"href":452,"rel":453},"https:\u002F\u002Fwww.prisma.io\u002Fdataguide\u002Ftypes\u002Frelational\u002Fexpand-and-contract-pattern",[38],"the expand and contract pattern",",\n“",[59,457,458],{},"Ensure the new changes work before you drop anything","”, etc.), but Prisma CLI does include all\nnecessary commands.",[30,461,462],{},"Here is the standard way:",[30,464,465],{},[88,466],{"alt":10,"src":467},"\u002Fimages\u002Ffd9e1-1dad2cugag60fmgvcfzsnzw.png",[30,469,470,471,474],{},"Don’t forget to add all your ",[150,472,473],{},"migration.sql"," scripts to your version control system.",[73,476,478],{"id":477},"prisma-studio","Prisma Studio",[30,480,481],{},"Prisma also includes a minimalist admin UI on top of your database.",[377,483,484,489],{},[30,485,486],{},[88,487],{"alt":10,"src":488},"\u002Fimages\u002Fd61d9-1uyri_3lkyquvcaaabyavww.png",[385,490,491],{},[30,492,493],{},"Result of running `prisma studio`",[30,495,496,497,502],{},"I’ve tried it plus a few other tools and have kept using ",[34,498,501],{"href":499,"rel":500},"https:\u002F\u002Ftableplus.com\u002F",[38],"TablePlus"," in the\nend.",[73,504,506],{"id":505},"what-i-like-about-prisma","What I like about Prisma",[30,508,509],{},"➕➕ TypeScript-first.",[30,511,512,513,342,518,523,524],{},"➕➕ Dynamic project, regular releases with good communication, huge community\non ",[34,514,517],{"href":515,"rel":516},"https:\u002F\u002Fprisma.slack.com\u002F",[38],"Slack",[34,519,522],{"href":520,"rel":521},"https:\u002F\u002Fwww.youtube.com\u002Fplaylist?list=PLn2e1F9Rfr6mjeYBSsSZoHFVjMq0nCtfL",[38],"Prisma Day 2021",",\netc. ",[59,525,526],{},"(Like any other tool, we don’t know if it will still be that dynamic in a few years!)",[30,528,529,530,535],{},"➕➕ A wide and well-written documentation. For example, I was looking for a place to host my\ndatabase and I ended up reading\na ",[34,531,534],{"href":532,"rel":533},"https:\u002F\u002Fwww.prisma.io\u002Fdataguide\u002Fpostgresql\u002F5-ways-to-host-postgresql",[38],"Prisma post about it","!",[30,537,538],{},"➕➕ Community seems to have a positive opinion on the tool.",[73,540,542],{"id":541},"caveats","Caveats",[233,544,545,554,564],{},[236,546,547,548,553],{},"One time, I ended up outside “the right migration flow” and I had to manually mark some migration\nscripts as “done”. Once\nagain ",[34,549,552],{"href":550,"rel":551},"https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Fguides\u002Fdatabase\u002Fdeveloping-with-prisma-migrate\u002Fbaselining#baselining-a-database",[38],"the documentation"," was\nhelpful but it took me some time to understand what was going on.",[236,555,556,559,560,563],{},[81,557,558],{},"Composite primary keys"," in your ",[150,561,562],{},"schema.prisma"," tend to generate not-so-easy-to-use TypeScript\ntypes. But Prisma team has worked on that when releasing v3 so you’ll have more control on how to\nname these constraints.",[236,565,566,567,570],{},"Using ",[81,568,569],{},"enums"," in your schema can be too much of a constraint compared to defining your enums in\nyour code. Once again that’s a personal tradeoff: more flexibility with enums in JS\u002FTS vs more\nsecurity with DB-level enums.",[73,572,574],{"id":573},"some-more-resources","Some more resources",[30,576,577,578],{},"👉 Getting started with Prisma:\n",[34,579,580],{"href":580,"rel":581},"https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Fgetting-started",[38],[30,583,584,585],{},"👉 Should you use Prisma?:\n",[34,586,587],{"href":587,"rel":588},"https:\u002F\u002Fwww.prisma.io\u002Fdocs\u002Fconcepts\u002Foverview\u002Fshould-you-use-prisma",[38],[30,590,591,592],{},"👉 Shared Prisma Roadmap:\n",[34,593,594],{"href":594,"rel":595},"https:\u002F\u002Fwww.notion.so\u002FPrisma-Roadmap-50766227b779464ab98899accb98295f",[38],{"title":10,"searchDepth":11,"depth":11,"links":597},[598,604,607,608,609,610,611,612,613,614],{"id":75,"depth":11,"text":76,"children":599},[600,602,603],{"id":97,"depth":601,"text":98},3,{"id":115,"depth":601,"text":116},{"id":133,"depth":601,"text":134},{"id":199,"depth":11,"text":200,"children":605},[606],{"id":268,"depth":601,"text":269},{"id":304,"depth":11,"text":305},{"id":371,"depth":11,"text":372},{"id":399,"depth":11,"text":400},{"id":445,"depth":11,"text":446},{"id":477,"depth":11,"text":478},{"id":505,"depth":11,"text":506},{"id":541,"depth":11,"text":542},{"id":573,"depth":11,"text":574},"2022-01-10","I’ve been using Prisma for a few months, and I’ve recently given a talk about it, let’s try to recap some takeaways here.","en",{},"\u002Farticles\u002F2022-01-10-prisma-to-interact-with-my-db",7,{"title":25,"description":616},"articles\u002F2022-01-10-prisma-to-interact-with-my-db",[624],"Tech","bFwhlySavRnAXnsLTsVsiJPeKyOGZoB-j0Fn8K132dQ",[627,640,652,664,677,689,696,709,722,735,747,759,772,784,796,808,820,832,844,856,869,881,893,906,918,930],{"id":628,"title":629,"body":630,"description":10,"extension":13,"meta":634,"name":635,"navigation":16,"path":636,"readingTime":18,"seo":637,"stem":638,"__hash__":639},"authors\u002Fauthors\u002Falexandre-guillon.md","Software Engineer",{"type":7,"value":631,"toc":632},[],{"title":10,"searchDepth":11,"depth":11,"links":633},[],{},"Alexandre Guillon","\u002Fauthors\u002Falexandre-guillon",{"title":629,"description":10},"authors\u002Falexandre-guillon","4tf48mjyjFNqItOHaulICbrjeCyMag1o6801uHeTz98",{"id":641,"title":629,"body":642,"description":10,"extension":13,"meta":646,"name":647,"navigation":16,"path":648,"readingTime":18,"seo":649,"stem":650,"__hash__":651},"authors\u002Fauthors\u002Falexis-ablain.md",{"type":7,"value":643,"toc":644},[],{"title":10,"searchDepth":11,"depth":11,"links":645},[],{},"Alexis Ablain","\u002Fauthors\u002Falexis-ablain",{"title":629,"description":10},"authors\u002Falexis-ablain","_SIAtB7f-39e5t3GiJof81NP47s6MGo2n4gaHkTy1uQ",{"id":653,"title":5,"body":654,"description":10,"extension":13,"meta":658,"name":659,"navigation":16,"path":660,"readingTime":18,"seo":661,"stem":662,"__hash__":663},"authors\u002Fauthors\u002Faxel-shaita.md",{"type":7,"value":655,"toc":656},[],{"title":10,"searchDepth":11,"depth":11,"links":657},[],{},"Axel Shaïta","\u002Fauthors\u002Faxel-shaita",{"title":5,"description":10},"authors\u002Faxel-shaita","fK0argUhsBkWLjpTAhY13oYLVzQthcEYkCEdtHWmIgE",{"id":665,"title":666,"body":667,"description":10,"extension":13,"meta":671,"name":672,"navigation":16,"path":673,"readingTime":18,"seo":674,"stem":675,"__hash__":676},"authors\u002Fauthors\u002Fbaptiste-faure.md","Head of Talent Acquisition",{"type":7,"value":668,"toc":669},[],{"title":10,"searchDepth":11,"depth":11,"links":670},[],{},"Baptiste Faure","\u002Fauthors\u002Fbaptiste-faure",{"title":666,"description":10},"authors\u002Fbaptiste-faure","ELisToYtcgHmgdVWZkCclTPV6exZtfyXqhpx1jjbJHs",{"id":678,"title":629,"body":679,"description":10,"extension":13,"meta":683,"name":684,"navigation":16,"path":685,"readingTime":18,"seo":686,"stem":687,"__hash__":688},"authors\u002Fauthors\u002Fbenjamin-bouillot.md",{"type":7,"value":680,"toc":681},[],{"title":10,"searchDepth":11,"depth":11,"links":682},[],{},"Benjamin Bouillot","\u002Fauthors\u002Fbenjamin-bouillot",{"title":629,"description":10},"authors\u002Fbenjamin-bouillot","tbhCFZyfTt7ZM5b5YgqQ2nhgnSTl8BweaQQryc87fHo",{"id":4,"title":5,"body":690,"description":10,"extension":13,"meta":694,"name":15,"navigation":16,"path":17,"readingTime":18,"seo":695,"stem":20,"__hash__":21},{"type":7,"value":691,"toc":692},[],{"title":10,"searchDepth":11,"depth":11,"links":693},[],{},{"title":5,"description":10},{"id":697,"title":698,"body":699,"description":10,"extension":13,"meta":703,"name":704,"navigation":16,"path":705,"readingTime":18,"seo":706,"stem":707,"__hash__":708},"authors\u002Fauthors\u002Fdavid-touzet.md","Staff Engineer",{"type":7,"value":700,"toc":701},[],{"title":10,"searchDepth":11,"depth":11,"links":702},[],{},"David Touzet","\u002Fauthors\u002Fdavid-touzet",{"title":698,"description":10},"authors\u002Fdavid-touzet","dHWwnQxb1Ubt-WwXWEODGEo9AFoq1cJUhfg3kdnYSBM",{"id":710,"title":711,"body":712,"description":10,"extension":13,"meta":716,"name":717,"navigation":16,"path":718,"readingTime":18,"seo":719,"stem":720,"__hash__":721},"authors\u002Fauthors\u002Feloise-chizat.md","Data Engineer",{"type":7,"value":713,"toc":714},[],{"title":10,"searchDepth":11,"depth":11,"links":715},[],{},"Eloïse Chizat","\u002Fauthors\u002Feloise-chizat",{"title":711,"description":10},"authors\u002Feloise-chizat","Utd72Vm9qT4hh2ZbFi6a2_nXw5Wb494Ed_HL1ra5yw8",{"id":723,"title":724,"body":725,"description":10,"extension":13,"meta":729,"name":730,"navigation":16,"path":731,"readingTime":18,"seo":732,"stem":733,"__hash__":734},"authors\u002Fauthors\u002Femmanuel-auclair.md","Staff engineer",{"type":7,"value":726,"toc":727},[],{"title":10,"searchDepth":11,"depth":11,"links":728},[],{},"Emmanuel Auclair","\u002Fauthors\u002Femmanuel-auclair",{"title":724,"description":10},"authors\u002Femmanuel-auclair","MtsA8THNLEn0dTtYEIQaGwDuf7MjQL55IOeei5gugEg",{"id":736,"title":629,"body":737,"description":10,"extension":13,"meta":741,"name":742,"navigation":16,"path":743,"readingTime":18,"seo":744,"stem":745,"__hash__":746},"authors\u002Fauthors\u002Fhoreb-parraud.md",{"type":7,"value":738,"toc":739},[],{"title":10,"searchDepth":11,"depth":11,"links":740},[],{},"Horeb Parraud","\u002Fauthors\u002Fhoreb-parraud",{"title":629,"description":10},"authors\u002Fhoreb-parraud","ajjsnUX4ohZI-ghMdbb92q_taWDkKXVZSLZXoAeLQtg",{"id":748,"title":5,"body":749,"description":10,"extension":13,"meta":753,"name":754,"navigation":16,"path":755,"readingTime":18,"seo":756,"stem":757,"__hash__":758},"authors\u002Fauthors\u002Fhugo-contreras.md",{"type":7,"value":750,"toc":751},[],{"title":10,"searchDepth":11,"depth":11,"links":752},[],{},"Hugo Contreras","\u002Fauthors\u002Fhugo-contreras",{"title":5,"description":10},"authors\u002Fhugo-contreras","2nc3VMu9ASq9Z6Pwx2-7-Ye991Pww4p-UEDBQFfjF-Q",{"id":760,"title":761,"body":762,"description":10,"extension":13,"meta":766,"name":767,"navigation":16,"path":768,"readingTime":18,"seo":769,"stem":770,"__hash__":771},"authors\u002Fauthors\u002Fjulien-tassin.md","Head of Engineering",{"type":7,"value":763,"toc":764},[],{"title":10,"searchDepth":11,"depth":11,"links":765},[],{},"Julien Tassin","\u002Fauthors\u002Fjulien-tassin",{"title":761,"description":10},"authors\u002Fjulien-tassin","iUIHI7SITje38Jh9X9uvYs4-VsHx4eCdt6hAlyLFG_o",{"id":773,"title":629,"body":774,"description":10,"extension":13,"meta":778,"name":779,"navigation":16,"path":780,"readingTime":18,"seo":781,"stem":782,"__hash__":783},"authors\u002Fauthors\u002Flaurent-renard.md",{"type":7,"value":775,"toc":776},[],{"title":10,"searchDepth":11,"depth":11,"links":777},[],{},"Laurent Renard","\u002Fauthors\u002Flaurent-renard",{"title":629,"description":10},"authors\u002Flaurent-renard","5BP7Ed-pt1SQHjh0UJ1XUrlLTcdlFaDoKBCP4deHq8A",{"id":785,"title":629,"body":786,"description":10,"extension":13,"meta":790,"name":791,"navigation":16,"path":792,"readingTime":18,"seo":793,"stem":794,"__hash__":795},"authors\u002Fauthors\u002Fleo-martin.md",{"type":7,"value":787,"toc":788},[],{"title":10,"searchDepth":11,"depth":11,"links":789},[],{},"Léo Martin","\u002Fauthors\u002Fleo-martin",{"title":629,"description":10},"authors\u002Fleo-martin","eYxCHkRgbGDV7shKdTA9s7Tu0zGV4yDGFoKR5MHQntY",{"id":797,"title":629,"body":798,"description":10,"extension":13,"meta":802,"name":803,"navigation":16,"path":804,"readingTime":18,"seo":805,"stem":806,"__hash__":807},"authors\u002Fauthors\u002Floic-bousquet.md",{"type":7,"value":799,"toc":800},[],{"title":10,"searchDepth":11,"depth":11,"links":801},[],{},"Loïc Bousquet","\u002Fauthors\u002Floic-bousquet",{"title":629,"description":10},"authors\u002Floic-bousquet","ko12qZwiGL8XNjAoy9oWypPkIjr29Pbq7vhdtgldqeQ",{"id":809,"title":629,"body":810,"description":10,"extension":13,"meta":814,"name":815,"navigation":16,"path":816,"readingTime":18,"seo":817,"stem":818,"__hash__":819},"authors\u002Fauthors\u002Floic-poullain.md",{"type":7,"value":811,"toc":812},[],{"title":10,"searchDepth":11,"depth":11,"links":813},[],{},"Loïc Poullain","\u002Fauthors\u002Floic-poullain",{"title":629,"description":10},"authors\u002Floic-poullain","oRIyJhFRTqxy5dLCYQ2OnYZ1DB-gLDUM-85vTSYuTF0",{"id":821,"title":711,"body":822,"description":10,"extension":13,"meta":826,"name":827,"navigation":16,"path":828,"readingTime":18,"seo":829,"stem":830,"__hash__":831},"authors\u002Fauthors\u002Fmaud-lelu.md",{"type":7,"value":823,"toc":824},[],{"title":10,"searchDepth":11,"depth":11,"links":825},[],{},"Maud Lélu","\u002Fauthors\u002Fmaud-lelu",{"title":711,"description":10},"authors\u002Fmaud-lelu","MMbsCKuE41OMHusrl12FIEsI-Trx7l8Nn_ANhvj2_y4",{"id":833,"title":5,"body":834,"description":10,"extension":13,"meta":838,"name":839,"navigation":16,"path":840,"readingTime":18,"seo":841,"stem":842,"__hash__":843},"authors\u002Fauthors\u002Fnicolas-poirier.md",{"type":7,"value":835,"toc":836},[],{"title":10,"searchDepth":11,"depth":11,"links":837},[],{},"Nicolas Poirier","\u002Fauthors\u002Fnicolas-poirier",{"title":5,"description":10},"authors\u002Fnicolas-poirier","dXrJkYo8az4SN_D23aYc3fQ7z8s1dR2a0lt1ogjAjJs",{"id":845,"title":5,"body":846,"description":10,"extension":13,"meta":850,"name":851,"navigation":16,"path":852,"readingTime":18,"seo":853,"stem":854,"__hash__":855},"authors\u002Fauthors\u002Fraphael-sauget.md",{"type":7,"value":847,"toc":848},[],{"title":10,"searchDepth":11,"depth":11,"links":849},[],{},"Raphaël Sauget","\u002Fauthors\u002Fraphael-sauget",{"title":5,"description":10},"authors\u002Fraphael-sauget","Uri9bcq0QDuxRA0PbBoNtu7p_5L3dALu4kzcXVW0xyM",{"id":857,"title":858,"body":859,"description":10,"extension":13,"meta":863,"name":864,"navigation":16,"path":865,"readingTime":18,"seo":866,"stem":867,"__hash__":868},"authors\u002Fauthors\u002Fromain-koenig.md","Co-funder & Head of innovation",{"type":7,"value":860,"toc":861},[],{"title":10,"searchDepth":11,"depth":11,"links":862},[],{},"Romain Koenig","\u002Fauthors\u002Fromain-koenig",{"title":858,"description":10},"authors\u002Fromain-koenig","uyS8--eG2_ezyqRABcJnMJmQKKuSArhPWd14aUvFeEw",{"id":870,"title":5,"body":871,"description":10,"extension":13,"meta":875,"name":876,"navigation":16,"path":877,"readingTime":18,"seo":878,"stem":879,"__hash__":880},"authors\u002Fauthors\u002Fromaric-juniet.md",{"type":7,"value":872,"toc":873},[],{"title":10,"searchDepth":11,"depth":11,"links":874},[],{},"Romaric Juniet","\u002Fauthors\u002Fromaric-juniet",{"title":5,"description":10},"authors\u002Fromaric-juniet","4Zb2artgT-eo-PHLXi3xi4d5t7s6PfhUxeSfXIikSUY",{"id":882,"title":629,"body":883,"description":10,"extension":13,"meta":887,"name":888,"navigation":16,"path":889,"readingTime":18,"seo":890,"stem":891,"__hash__":892},"authors\u002Fauthors\u002Fstanyslas-bres.md",{"type":7,"value":884,"toc":885},[],{"title":10,"searchDepth":11,"depth":11,"links":886},[],{},"Stanyslas Bres","\u002Fauthors\u002Fstanyslas-bres",{"title":629,"description":10},"authors\u002Fstanyslas-bres","Xa0SahETuiN4q1jrmR2ych3moAqcZ2LbU7vSfEt2RuU",{"id":894,"title":895,"body":896,"description":10,"extension":13,"meta":900,"name":901,"navigation":16,"path":902,"readingTime":18,"seo":903,"stem":904,"__hash__":905},"authors\u002Fauthors\u002Ftalent-acquisition.md","Talent Acquisition",{"type":7,"value":897,"toc":898},[],{"title":10,"searchDepth":11,"depth":11,"links":899},[],{},"Équipe Talent Acquisition","\u002Fauthors\u002Ftalent-acquisition",{"description":10},"authors\u002Ftalent-acquisition","doDfE76txftQ4wIiKjJoDmSpyzSKk0tzlgVAp6-opAY",{"id":907,"title":629,"body":908,"description":10,"extension":13,"meta":912,"name":913,"navigation":16,"path":914,"readingTime":18,"seo":915,"stem":916,"__hash__":917},"authors\u002Fauthors\u002Fvictor-borg.md",{"type":7,"value":909,"toc":910},[],{"title":10,"searchDepth":11,"depth":11,"links":911},[],{},"Victor Borg","\u002Fauthors\u002Fvictor-borg",{"title":629,"description":10},"authors\u002Fvictor-borg","-Za-JweoiP6hyclue_WkxMXdRUDTczPGlJf6AZckjUc",{"id":919,"title":629,"body":920,"description":10,"extension":13,"meta":924,"name":925,"navigation":16,"path":926,"readingTime":18,"seo":927,"stem":928,"__hash__":929},"authors\u002Fauthors\u002Fvirgil-roger.md",{"type":7,"value":921,"toc":922},[],{"title":10,"searchDepth":11,"depth":11,"links":923},[],{},"Virgil Roger","\u002Fauthors\u002Fvirgil-roger",{"title":629,"description":10},"authors\u002Fvirgil-roger","DfVFe5j0bCgXeEr381ZYOM5DP4m-pWb93J9-m_muKJ0",{"id":931,"title":629,"body":932,"description":10,"extension":13,"meta":936,"name":937,"navigation":16,"path":938,"readingTime":18,"seo":939,"stem":940,"__hash__":941},"authors\u002Fauthors\u002Fyukan-zhao.md",{"type":7,"value":933,"toc":934},[],{"title":10,"searchDepth":11,"depth":11,"links":935},[],{},"Yukan Zhao","\u002Fauthors\u002Fyukan-zhao",{"title":629,"description":10},"authors\u002Fyukan-zhao","LRPHugtAJnWHsmHxy9_SR5Zas_C5p-GR_uHEs1Fhk_E",1778159253216]