Raw SQL, SQL Query Builder, or ORM?

Поділитися
Вставка
  • Опубліковано 3 чер 2024
  • Not sure if you should use Raw SQL, a SQL query builder, or an ORM for your next project? In this video, I’ll explore the pros and cons of each option, allowing you to make an informed decision based on your specific needs. Choosing the wrong technology for your project can be a costly mistake, so it's crucial to understand these tools.
    Code example on GitHub: github.com/ArjanCodes/2023-orm
    ✍🏻 Take a quiz on this topic: www.learntail.com/quiz/syflxl
    🚀 Next-Level Python Skillshare Class: skl.sh/3ZQkUEN
    👷 Join the FREE Code Diagnosis Workshop to help you review code more effectively using my 3-Factor Diagnosis Framework: www.arjancodes.com/diagnosis
    💻 ArjanCodes Blog: www.arjancodes.com/blog
    🎓 Courses:
    The Software Designer Mindset: www.arjancodes.com/mindset
    The Software Designer Mindset Team Packages: www.arjancodes.com/sas
    The Software Architect Mindset: Pre-register now! www.arjancodes.com/architect
    Next Level Python: Become a Python Expert: www.arjancodes.com/next-level...
    The 30-Day Design Challenge: www.arjancodes.com/30ddc
    🛒 GEAR & RECOMMENDED BOOKS: kit.co/arjancodes.👍 If you enjoyed this content, give this video a like. If you want to watch more of my upcoming videos, consider subscribing to my channel!
    💬 Discord: discord.arjan.codes
    🐦Twitter: / arjancodes
    🌍LinkedIn: / arjancodes
    🕵Facebook: / arjancodes
    📱Instagram: / arjancodes
    ♪ Tiktok: / arjancodes
    👀 Code reviewers:
    - Yoriz
    - Ryan Laursen
    - James Dooley
    - Dale Hagglund
    🎥 Video edited by Mark Bacskai: / bacskaimark
    💻 Code example by Henrique Branco: / henriqueajnb
    🔖 Chapters:
    0:00 Intro
    1:18 Code example
    2:09 Main options
    2:44 raw SQL
    7:12 ORM
    12:49 SQL query builder
    14:30 Final thoughts
    16:01 Outro
    #arjancodes #softwaredesign #python
    DISCLAIMER - The links in this description might be affiliate links. If you purchase a product or service through one of those links, I may receive a small commission. There is no additional charge to you. Thanks for supporting my channel so I can continue to provide you with free content each week!

КОМЕНТАРІ • 321

  • @ArjanCodes
    @ArjanCodes  7 місяців тому

    👷 Join the FREE Code Diagnosis Workshop to help you review code more effectively using my 3-Factor Diagnosis Framework: www.arjancodes.com/diagnosis

  • @williamburdett9867
    @williamburdett9867 Рік тому +170

    I'm a data engineer. I almost always use raw sql because I can more explicitly optimize queries

    • @mamneo2
      @mamneo2 Рік тому +4

      Incroyable.

    • @piyushagarwal8330
      @piyushagarwal8330 Рік тому +7

      Same, for my de work, it's better to write it once and use it multiple times with better efficiency for specific job

    • @alexandryu5072
      @alexandryu5072 Рік тому +4

      DS/DA same

    • @dansplain2393
      @dansplain2393 Рік тому +12

      I don’t even optimise the queries. I can just run them in my head faster.

    • @ryanbowns1517
      @ryanbowns1517 Рік тому +7

      Data Scientist here,
      Same I Prefer to use raw sql.
      I find Case statements within a window statement to be extremely useful

  • @kurt7020
    @kurt7020 Рік тому +102

    Almost always raw sql. Here's why:
    - I know exactly what I'm getting.
    - The query can be run completely independent from my app.
    - The query can be shared between multiple apps.
    - I can always find a DBA who can read raw sql.
    - I never have have to debug an abstraction for corner cases.
    - Every single advanced feature of my database is supported and works exactly as documented.
    - If I use a different language on a new project, my SQL knowledge is still valid.

    • @valcron-1000
      @valcron-1000 Рік тому +4

      Amen. Also, if you're using a language with compile time code execution there might be libraries available that check that your SQL code is valid

    • @lawrencedoliveiro9104
      @lawrencedoliveiro9104 Рік тому +6

      Another thing is, there are no language-independent ORMs. I do some stuff in PHP also, so I have to learn SQL anyway, I might as well do it properly.

    • @taehyun-lee
      @taehyun-lee Рік тому +3

      Just noobs curious, don't you worry about a security such as a SQL injection?

    • @taehyun-lee
      @taehyun-lee Рік тому

      I heard that it would be better to control the security part easily with using ORM while programmers need to think lots of things with the raw SQL for the security.

    • @ThanatosCG
      @ThanatosCG Рік тому

      +1.
      "- The query can be run completely independent from my app." is what really took the cake for me. It allows for food system abstraction where the database creation and its usage are well separated.

  • @hirolau
    @hirolau Рік тому +27

    My databases are typically complex. Never found abstractions around the SQL helped me. Just going raw SQL

    • @hirolau
      @hirolau 11 місяців тому

      With that said I have now got the task to build a DAL which generates a consistent way of extracting data from 15 tables. Sql-alchemy core has actually helped me a lot creating some of the dynamic parts of the queries.

  • @FlisB
    @FlisB Рік тому +25

    I like SQLalchemy, but I think raw SQL is a very useful skill to master, it is been around for ages and it will be around in the future as well.

  • @SaniSensei
    @SaniSensei Рік тому +25

    Note that, if you use e.g. Mapped[str] = mapped_column(...) - the nullability is also derived from the Mapped type. Mapped[str] would be NOT NULL in your cases, and you need either Mapped[Optional[str]] or Mapped[str | None] to allow NULL (or I believe set nullable=True explicitly)

  • @wp_panther
    @wp_panther Рік тому +7

    Subscribed for the smoke-signal, sign-language, and Binary Clown-based SQL queries. glad I finally found a channel paying attention to the bleeding edge of clownbit accessibility 🙏

  • @strikef7976
    @strikef7976 Рік тому +4

    Most of the tech debt I’ve come across has been caused by orm generated queries. It gets to the point where at scale you just have to use raw sql or you’ll be dealing with contention. Soft deletes, inserts are all a nightmare via ORMs. There are instances where an ORM will come in handy, such as building something quick, but it’s important to know the caveats of doing so; mainly that you’ll be hiring a sql person to refactor your ORM queries as you scale.

  • @CharlieSmithv2
    @CharlieSmithv2 Рік тому +6

    Would be interested in a part 2 where you give your thoughts on which to use given the application use case. My understanding is an ORM can help with a multi-user application like a Web frontend, where throttling to the DB might be necessary.
    In either event, it seems you need to know the SQL query you need (obviously) so would be a stretch to go above and beyond unless for performance or security.
    Thank you!

  • @miquelgonzalezrossello3940
    @miquelgonzalezrossello3940 Рік тому +1

    Thanks for the video Arjan! It's always advisable to close the connection when you're finished querying.

  • @amitnakash1642
    @amitnakash1642 Рік тому

    Love the channel Arjan! So grateful for your content! keep going!

  • @bryan_hiebert
    @bryan_hiebert 11 місяців тому +2

    I love taking a break, watching your channel and reading the comments. I think my brain grows every time.😂. I really like the implicit handling of transactions using ORM with SQLAlchemy. I think it just makes the code cleaner when working with tables that are unlikely to change. But when doing machine learning or exploratory data analysis the flexibility of SQL would certainly be the way to go.

  • @ZaItan1
    @ZaItan1 Рік тому +1

    A really nice feature I've seen experienced teams develop on top of ORM is some way to automate writing (or refreshing) those data classes by pre-reading tables in the database once. Seems like a natural addition to an ORM library.

  • @lawrencedoliveiro9104
    @lawrencedoliveiro9104 Рік тому

    12:50 I deal with that in one of two ways:
    * For some projects, there will be a schema file containing the requisite CREATE TABLE statements, included in the source tree and version-controlled along with everything else.
    * For other projects, particularly ones using SQLite, the program itself will automatically create the necessary tables each time it is asked to create a new database, so the CREATE TABLE statements will be in the program source code.

  • @manonthedollar
    @manonthedollar Рік тому +13

    Really great topic! I have experimented with ORMs but I just keep going back to raw SQL. I know exactly what's going on in my queries, I can get really nitty-gritty with optimizations, and it works with any language. It certainly can get rocky "manually" handling the mapping between python objects and their representations in a database, but there's no perfect solution for that I guess.

    • @GrattonB
      @GrattonB Рік тому

      Honestly using pandas "pd.read_sql_query()" function will give you a lovely dataframe while still allowing you to write raw queries.

  • @MedievalChips
    @MedievalChips Рік тому

    I've been struggling with this dilemma for quite some time now. Glad you made a video about it !

  • @edgeeffect
    @edgeeffect Рік тому +11

    A lot of people assume that the sole purpose of an ORM is to provide an abstraction over SQL. But the important thing about an ORM is that it maps result sets into objects. ORMs often (always?) do provide that abstraction layer over SQL but where we're often dealing with APIs that are expected to return result sets in JSON, it's the object mapping that's their most important function. Some ORMs take that "Object Mapping" idea a little to literally and only map data into "strict OOP" objects with some kind of class definition but often all we actually need is for the result set to be returned in a collection of nested dictionaries.

    • @vlntsolo
      @vlntsolo Рік тому

      Have a look at SQLModel from FastAPI creator Sebastián Ramírez.

    • @lawrencedoliveiro9104
      @lawrencedoliveiro9104 Рік тому +9

      ORMs don’t make any sense to me. The code doesn’t end up any simpler.

    • @stoched
      @stoched Рік тому +1

      Yes this is correct. The main benefit is mapping them to objects. The full on builder pattern stuff for sql really comes into play in a massive project and large databases with complicated relations. For the most part you only need a micro ORM

    • @dawidp749
      @dawidp749 Рік тому

      @@lawrencedoliveiro9104 xD

    • @ER-oj8mo
      @ER-oj8mo Рік тому

      @@lawrencedoliveiro9104 just wait til you’re writing queries that require data from 5+ tables, complex triggers, very specific repetitive logic, etc.
      SQLAlchemy 2.0’s ORM module is amazing 😊

  • @midicine2114
    @midicine2114 Рік тому +5

    Can you speak to the advantages and disadvantages between data mapper pattern vs active record?

  • @123344556kk
    @123344556kk 6 місяців тому

    I was looking for a query builder and your video helped a lot in giving me a solution. Thank you.

    • @ArjanCodes
      @ArjanCodes  6 місяців тому

      Glad it was helpful!

  • @vhphan19
    @vhphan19 Рік тому +20

    I almost always use raw SQL. And when I do, I use the Jetbrains IDE, such as Pycharm Professional (not community version). It has such great support for database which amongst other things:
    1) SQL syntax highlighting and SQL code completion from within the .py file
    2) Ability to run SQL query from any SQL text string in the .py file directly to the query console
    3) Provide ability to jump to SQL table or views definitions from python code...
    I do love VS Code. But as much as I love VS code, when it comes to any Python code that I need to use raw SQL, Jetbrains IDEs just blows VS Code out of the water.
    But of course, the con is it is not free :-)

    • @markippo
      @markippo Рік тому

      DataGrip... The only good thing that I could say about it... It's JetBrains - it looks like JetBrains, integrates with JetBrains - that's all. It's laggy, underperforming, full of bugs (it cannot even parse Sql Server structure properly). Putting it behind a pay wall is a big "no no" for me. Dbeaver community is free and does its job far more better...

  • @bernhardkrickl5197
    @bernhardkrickl5197 Рік тому +4

    The main problem with ORM is when you fall into the trap of stopping to think about and harness the power of the relational database model. You limit your possibilities and don't even notice. And I'm not talking about complicated queries here. Eg. with an ORM you can easily load big, deeply nested data from the DB into an Object. This is nice but can produce dramatic performance issues. This is not hypothetical. Been there, done that, didn't like the t-shirt.

  • @davidl3383
    @davidl3383 Рік тому

    Exactly when I start to study a fastapi project made with sqlachemy ORM.😊. You help me a lot !! I think if project is simple ORM seems to be cool. Query builder looks like very cool also, easy and helpfull when your are a catastrophe like me in SQL 😀. Merci

  • @markpaterson2260
    @markpaterson2260 Рік тому +1

    I would be interested in your views on if and when to move these kind of queries to stored procs and just use procs instead. I understand there are benefits to that, but I'm not sure what the downsides might be beyond having an extra place that you need to keep track of changes to your logic when iterating on a particular feature.

  • @shantanukaushikmathoholic
    @shantanukaushikmathoholic 3 місяці тому

    Very helpful discussion. Thanks for covering these topics.

    • @ArjanCodes
      @ArjanCodes  3 місяці тому

      I'm glad the content has been useful :)

  • @cyber4joy
    @cyber4joy Рік тому +4

    I always prefer to use raw SQL, and I have been doing SQL for 30-plus years.

  • @DS-tj2tu
    @DS-tj2tu Рік тому

    Thank you!

  • @Part-Time-Larry
    @Part-Time-Larry Рік тому +3

    I've only ever used an ORM when I first started out writing c# with entity framework. It was really good to be honest, but I moved to nodejs and for whatever reason I decided to go raw SQL and honestly haven't noticed any productivity loss. Thinking in SQL is actually very easy. It's algebraic after all.

  • @estebanmejia9989
    @estebanmejia9989 Рік тому

    man your vides are awesome, thank you

  • @kosmonautofficial296
    @kosmonautofficial296 Рік тому

    Thank you! I was just learning sql and getting in sql alchemy and was wondering this!

  • @Ziggity
    @Ziggity Рік тому +29

    Excellent content as always. Worth mentioning that ORMs might perform worse in some cases. And it's still very important to know SQL because you know.... Sometimes the abstraction magic doesn't work and you gotta look under the hood.

    • @magfal
      @magfal Рік тому +1

      The some is a bad choice of word. The absolute majority of anything beyond the absolute basics is what my experience tells me.
      I've lost count of the times I've replaced ORM code with a few well reasoned lines of SQL and improved performance by 3 orders of magnitude.

    • @zoladkow
      @zoladkow Рік тому

      @@magfal yup, the more abstraction an ORM has, then anything more complex than basic CRUD gets absurdly complex if not plain simply impossible... luckily there are workarounds like using custom native SQL then just mapping the results, but then you have a mix of structured and freetext anyway...

    • @magfal
      @magfal Рік тому

      @@zoladkow dapper is the least shitty application layer integration of an SQL server I've used.

  • @TomTrval
    @TomTrval Рік тому +1

    Hi Arjan thx for fine video.
    SQLAlchemy has architecture is onion layered, so you can use Query Builder in sqlalchemy it is called Core. I usually use it with custom python slot-ed dataclasses.
    I like the core does not change so often as ORM layer and provides:
    - query flexibility (you can always fall back to text query)
    - good protection against vulnerabilities
    - tables definition and create_all metadata ( DataDefinitionLanguage )

    • @nutbusted27
      @nutbusted27 Рік тому +1

      Yeah was about to comment this, we use the core (or sql expression as we call it) and its a nice middleground.

  • @qsykip
    @qsykip Рік тому +2

    You should also do a video about Alembic. It's developed by the creators of SQLAlchemy and it integrates so well with it.

  • @marioluizbernardinelli2659
    @marioluizbernardinelli2659 Рік тому +9

    Hi, Arjan. Nice video. I have a suggestion for an another video: SQL and NoSQL comparison. Think about this. Thank you.

    • @lawrencedoliveiro9104
      @lawrencedoliveiro9104 Рік тому +1

      I don’t think there’s such a thing as “NoSQL” any more. Even the non-relational DBMSes are adopting forms of SQL for their query languages.

    • @davidec3240
      @davidec3240 Рік тому

      NoSql are dead, use memcached to cache, redis for pub/sub or queue... Put everything else in a table, inside a sql db

  • @CarlosMorenoV
    @CarlosMorenoV Рік тому +1

    Nice viewo Arjan!. Well, I prefer the raw SQL approach. Jajaja, I have been checking sqlalchemy this year, and it looks really cool as well. Maybe I will use it in the future. I did not know anything about the Query Builder option, it is like a intermediate alternative between ORMS and RAW, great.

  • @julienyt1600
    @julienyt1600 Рік тому +4

    SQLModel, combine validation with pydantic and sqlalchemy In the same code.

  • @zammea
    @zammea Рік тому +2

    Hey Arjan, I started learning programing with Python, curently I work as SQL Developer and more spesificaly Transact-SQL (Microsoft SQL Server). I loved the power of ORM when I was learing to code with Python and Django. However now after I worked for so long with raw SQL I can honestly say there are some stuff that the database does that ORM can't, for example, reating indexes, stored procedures, optimising execuition palans and so on. Overall I believe even with ORM you can leverage it even more when you give a go learing sql database and how it work. Thanks for the video it was really cool to see.

    • @dawidp749
      @dawidp749 Рік тому

      I dont know about the rest but you are able to manage indexes in orm

    • @zammea
      @zammea Рік тому

      @@dawidp749 indeed you can. Why argument was that SQL and DB administration is a good skill to have.

  • @lawrencedoliveiro9104
    @lawrencedoliveiro9104 Рік тому +5

    6:16 Just a note that splitting things out into separate files will slow down loading, compared to having it all in the same file.

    • @GuyWicks
      @GuyWicks Рік тому +1

      Have you measured this?
      FWIW, the OS is VERY good at caching recently opened files, and it's not as if you're having to wait for spinning disks anymore. So the overhead is really fractional, when compared to the time taken in the SQL layer anyway.

    • @mariuszp1649
      @mariuszp1649 5 місяців тому

      Even better is to create views and functions in sql database.

  • @rood486
    @rood486 Рік тому

    Great video uncle Arjan.

  • @nathanbrown2640
    @nathanbrown2640 Рік тому +2

    I often use a hybrid of ORM and raw SQL:
    Some more complex parts of a query I might write as raw SQL, then pass them into the ORM alongside more standard things like selecting normal columns and making reasonably simple joins.
    I do sometimes use the SQLAlchemy `with_hint` method to force certain indexes to be used.
    One very important thing to note about SQLAlchemy is that it has a `Core` and an `ORM` - I know SQLAlchemy 2.0 changes some of this up, but we are still on 1.x.
    The `Core` side compiles statements, executes them and returns simple tuples of the raw data.
    The `ORM` side can allow you to fetch an entire row of the table, loaded as a Python Class, meaning you can have your own custom methods defined on that class for calculated properties used later, or for common functions to update fields on the row all at once.
    The ORM query can be much bigger (it will fetch all fields on a table), but can be powerful if you want are try to be Object-Oriented - you effectively treat each row of a table as an Object. Though, again, for many situations where speed of queries is important, you often just want to load the limited data you need and keep it quick.
    (That said, SQLAlchemy have 'Bundles' which allow you to subclass the main Class for a Table and limit down the columns loaded - SOOOO helpful for speeding up some of my queries loading a half-dozen columns of a 30+ column table)
    The SQL Injection protection is massive for a webapp if we are using customer input in the query (especially searches!) and resorting to raw SQL, even in part, needs that little more careful attention to prevent possibilities.

    • @mahmoudhosny8881
      @mahmoudhosny8881 3 місяці тому

      I am not really experienced with this stuff, can I ask you for a bit more detail? Wouldn't that make things just a bit more confusing overall rather than just using one method? Or is this for a particular use case? Trying to decide what I should go for for my first web app. Also I am probably going to be using Django's ORM if I do, as I will use it as a framework, so if you have any thoughts on that too that'd be great. Thanks :)

  • @fernandino1909
    @fernandino1909 Рік тому

    I am trying to learn sqlalchemy but that's really hard. Hey I just found out about something called codon. You could do a video on that, the differences and the multithreading. That looks dope. Love your content!!!

  • @salaahamin6558
    @salaahamin6558 Рік тому

    One thing worth mentiong regarding ORMs. It's very easy to fall into the trap of creating the N+1 problem if joins are not added correctly. This is particularly apparently in Django ORM.

  • @LookNumber9
    @LookNumber9 Рік тому

    Useful information. Thank you! I'm curious what you think about SQLModel.

  • @igordemetriusalencar5861
    @igordemetriusalencar5861 Рік тому +1

    Awesome video, as always but more I lean Python more I Like R functional way to work with data. I use raw SQL always.

  • @Jishnu_Nath
    @Jishnu_Nath Рік тому +1

    Dapper, query builder, stored proc, ORM, raw SQL

  • @dorb1337
    @dorb1337 Рік тому

    Great video :) as always

  • @KLM1107
    @KLM1107 Рік тому +21

    I'd definitely stick with an ORM. For databases which are changing in the development phase you can use mirroring to have the ORM pull it's shape directly from the tables it's accessing.
    Also, if you do run into a very tricky corner case where you need to construct a raw SQL query you can send that with the ORM, or you could create a view in the database itself and point the ORM at that.

    • @sachinfulsunge9977
      @sachinfulsunge9977 8 місяців тому +1

      Can you explain to me what mirroring is and how we achieve it in sqlalchemy ?

    • @danielmcpherson9062
      @danielmcpherson9062 6 місяців тому +1

      @@sachinfulsunge9977when you use an ORM, you know how you have to specify the tables and the columns you have in your database? Well ORMs can do that for you - they look at the database and create classes that “mirror” the tables and columns.
      I don’t know about SQLAlchemy, but if you ever use Prisma, then you would run:
      prisma db pull
      (You may need to add “npx” or whatever package manager you’re using before the command)

  • @jolieriskin4446
    @jolieriskin4446 Рік тому

    Peewee ORM. I like the flexibility of designing and using it with sqlite3 locally and not having to worry about whatever is going to be the production back-end. I usually set it up so i can swap back and forth between production and my local environment.

  • @TannerBarcelos
    @TannerBarcelos 11 місяців тому +1

    While I like ORMs because they get you going fast on projects when you aren’t really interested in how the underlying queries are written / work, I’m in the camp of using raw sql and the native drivers for the languages I use (Java, Python or TS). It’s great because you can continuously practice your sql skills while writing app code, you can get full control over the sql and functionality and you can optimize right within the implementation.
    Plus writing sql is fun.

  • @lawrencedoliveiro9104
    @lawrencedoliveiro9104 Рік тому +1

    8:02 DBMSes themselves usually provide some kind of introspection facilities, though this varies a lot. For example, SQLite provides enough information that you should be able to programmatically derive the entire database schema without having to parse actual SQL, while MySQL/MariaDB is a bit more limited.
    The question is: do ORMs make use of this? Doesn’t seem like it.

  • @radupopa6642
    @radupopa6642 9 місяців тому +1

    I've always preferred the raw SQL. I need to know it anyway, to find my way through the database, review and validate the data, etc. My approach, most of the time, is to design and test the SQL on its own, in a SQL editor. After that I integrate it in the client code, with the confidence that the SQL works.

  • @rrwoodyt
    @rrwoodyt Рік тому +2

    SQLAlchemy is nice for *most* work, though it seems to get in the way when I want to execute some really complicated query. And beware of mixing raw SQL updates with orm activity, since the SQLAlchemy object cache doesn't automagically know what you've done if you alter data directly via a session.execute( ).

  • @vxsniffer
    @vxsniffer Рік тому +1

    much depends on your background, for instance, I don't expect many ORM users in data science field, where raw SQL is key tool itself... I also prefer raw SQL coz, in my eyes, additional abstraction layer introduces more complexity and risk of errors... from the other hand ORM seems natural in web world... diversity is beautiful ;-) very nice video Arjan, thank you!

  • @magfal
    @magfal Рік тому +6

    Most ORMs are limited by supporting multiple databases since it forces usage of the lowest common denominator. In the case of postgres that means you leave 80% of the potential behind.

    • @robertmazurowski5974
      @robertmazurowski5974 9 місяців тому

      But for writing quick Crud it is fine.

    • @magfal
      @magfal 9 місяців тому

      @@robertmazurowski5974 even then I wouldn't use it for bulk actions such as importing 1000s of rows at the same time.

    • @robertmazurowski5974
      @robertmazurowski5974 9 місяців тому

      @@magfal if your a data analysts don't use ORM. What web app would do 1000s of rows?

    • @magfal
      @magfal 9 місяців тому

      @@robertmazurowski5974 if you ingest a list of customer or a list of products it's a bulk action.
      Accepting an Excel through a web interface, validating and importing from it is a good user experience for some people.

  • @mrmuranga
    @mrmuranga Рік тому

    useful..thanks

  • @IBMboy
    @IBMboy Рік тому

    My strategy is: first ORM, and query builder only if required. Some query builders offer raw statements functions which come with string sanitization to avoid sql injections.

  • @MH-oc4de
    @MH-oc4de Рік тому +3

    I mainly use the ORM (sqlalchemy) because I'm dealing with a very complex and extensive schema. It works well for development, in that it makes it easier/cleaner to write code. However, I've noticed that for large databases, using the ORM when retrieving objects (rows) is slow (by a lot!) compared to raw sql queries. I guess the overhead cost of creating python objects from the raw queries starts to add up. That's the one downside I've noticed with sqlalchemy.

  • @marcelvanLare
    @marcelvanLare Рік тому

    As a database dev i like the option of a database procedure with the sql there returning a ref cursor.

  • @N8ontv
    @N8ontv 8 місяців тому +3

    I prefer raw queries. They allow for better optimization, and the SQL engine you use is far less likely to change than the programming language you access it from.
    ORMs kinda bear additional overhead in that you need to define your schema twice(in you mappers and in your migration scripts), while the other two only need it defined in one place.
    Also, no matter which you pick you're still learning and executing all of the same SQL concepts. I've kinda landed in the camp that the only scenarios in which an ORM is being used effectively are also scenarios where you don't actually need an ORM.

  • @Prakhar79
    @Prakhar79 Рік тому

    Great content Arjan and team! Can you make something for DynamoDB? Do you recommend any libraries for that?

  • @bogdanp1351
    @bogdanp1351 Рік тому +2

    Great video! Another point to touch on are database migrations. With SQLAlchemy you can use Alembic to auto-generate your migration files based on your Python DB models. It's not perfect, but it does 90% of the job. With Raw SQL or SQL query builder you have to write migrations by hand. Would you still use Alembic to manage these migrations or something else?

    • @voxelfusion9894
      @voxelfusion9894 Рік тому

      You could have AI write the migration these days.

  • @dimitro.cardellini
    @dimitro.cardellini Рік тому

    ORM can lead to abstraction leaks when its models appear everywhere in the application, which brings an additional pain if domain structure differs from storage structure.
    So, I'm using ORM to manage migration and using almost raw-sql to interact with DB

  • @TheGtmail
    @TheGtmail Рік тому +5

    Raw SQL definitely! Reducing the dependencies.

  • @ranjansingh9972
    @ranjansingh9972 Рік тому

    I guess what I'm curious about is what is the right way to persist Python objects to DB so that your applications state is sensibly captured? And then on the flip-side, how should application objects stored in DB be sensibly retrieved?

  • @bilbo1337
    @bilbo1337 Рік тому +1

    Would be good to mention n+1 queries with ORMs

  • @MatsRolfson
    @MatsRolfson Рік тому

    Arjan, you could have demonstrated the built in SQLalchemy query language, using native python syntax to filter, group and so on to demonstrate that you don't have to learn sql at all. I think i the biggest strength of SQLAlchemy similiar to hibernate/nhibernate in java/C#

  • @nicolaspillot5789
    @nicolaspillot5789 2 місяці тому

    Could you please alaborate on the difficulty (or it's absence) to evolve/regress the application schema and code between releases ?

  • @dirkschannel5817
    @dirkschannel5817 7 місяців тому

    It depends :-) When starting from scratch with a smaller web project, an ORM is great. When adding to a bigger application, where parts are developed in different languages with a central database raw SQL often is the only option. I often saw, that complex queries where moved to stored procedures in the database and for another layer of possible validation, sanitation and security.

  • @gothicanatomist
    @gothicanatomist Рік тому

    I sometimes wonder if you can read my mind. Not for the first time, as I'm in the middle of wrestling with something python - boom, you drop a video on that exact topic! Thank you so much for this great overview.

  • @raj.svc.google911
    @raj.svc.google911 Рік тому +7

    Please talk about stored procedures. For mature schemas that contain deeply derived tables, I believe SPs to be arguably the best option for secure, efficient & idempotent inserts/updates.

  • @thekokoserver
    @thekokoserver Рік тому +2

    Personally i prefer ORM, because they it gives more interface to work with and make my work faster

  • @BrianStDenis-pj1tq
    @BrianStDenis-pj1tq Рік тому

    The fancier of a helper layer you use, like an ORM being fancier than query builder, the greater the risk that some security or other lacking feature bites you in the future. I see many older code bases having trouble due to unsupported or difficult to upgrade helper layers.

  • @marcopaolovaleriovezzoli5776
    @marcopaolovaleriovezzoli5776 6 місяців тому

    I love SQL, It Is really a great DSL once I learn It properly. I read also a couple of great Brooks from Joe Chelko which are really informative. While I also appreciate query builders I actually use ORMs in production, because migration are vitali in a project life cycle. Nice video

    • @ArjanCodes
      @ArjanCodes  6 місяців тому

      Thank you, Marco! Glad you enjoyed the video :)

  • @AlexeiCheban
    @AlexeiCheban Рік тому

    You can add --sql in start line and vscode will be show pretty sql query

  • @danielschmider5069
    @danielschmider5069 Рік тому +1

    You dont really need to define your schemas in code, you can also load them from the database's metadata.
    I feel like saying "You NEED to write your schema in your code!" will turn away a lot of people from an ORM. Having the database itself as the source of truth makes a lot of things much simpler, because a change on the database will always be reflected in your code automatically.
    This is very much relevant to the point you're making at 12:30. Basically, you import the schema from the database to your code instead.

  • @lawrencedoliveiro9104
    @lawrencedoliveiro9104 Рік тому

    2:55 Have you looked at apsw? I prefer that to the standard Python sqlite module.

  • @pacersgo
    @pacersgo Рік тому +14

    Migration is important for me. With Django it is included, and for sqlalchemy you can use alembic. Therefore I would use ORM for sure.

  • @alexforget
    @alexforget 11 місяців тому

    Django ORM, simple and integrated. Save so much work on most small/medium projects.
    - Free admin interface (already debugged) with security, users, login, etc.
    - Form conected to your models, etc.
    When it’s not up to the task, you drop to SQL for the few queries where you need something special

  • @jamesgoldman8188
    @jamesgoldman8188 9 місяців тому

    I'm a java developer, and we use spring jpa + hibernate orm.
    Most say that I'm conflicted, in the one hand, hibernate makes the whole process of working with the db as an entity so much easier and smooth, on the other, when it comes to preformence, it can be a pain to optimize it.

  • @public_static
    @public_static Рік тому

    Given that I mainly inquire about metadata related topics such as listing views, tables, columns, and data types using various database providers (both cloud-based and on-premises), what would be the optimal choice for me (if it even makes any difference)?

  • @adrianzuur5589
    @adrianzuur5589 Рік тому

    Thanks Arjan, interesting video, as always. A question: do these options make any difference in terms of trying to set up and maintain a "clean architecture" for an application? From reading online, I got the idea that ORMs can help you interface between inner layers, which handle business logic, from outer level "details" like the specific database you use. But, watching your video, I wonder if you can't also do that decoupling with raw SQL or query builders. Maybe using raw SQL makes changes to the DBMS more cumbersome to manage? But, at the same time, if you are at an early phase in your project, and your database data models are still not stable, does ORM actually help? It seems like ORMs help you decouple from the DBMS, but actually increase coupling to how relations are defined inside the database... Does that make any sense? Anyway, excuse me for the digression, and thanks again.

  • @ZaItan1
    @ZaItan1 Рік тому

    As a data analytics engineer, I personally use raw SQL most often to keep queries portable between apps and people, and to make optimization easier.
    Something which always bothers me: SQL is great, but it's sometimes not as testable as something like PySpark Dataframe API or functions built on ORM. There is value in specifying a query plan in chunks that may be isolated and re-used...though it doesn't always work out as nicely. SQL tends to demand more integration testing, which is fine too.

  • @GuyWicks
    @GuyWicks Рік тому

    If you're building a database heavy application (a CRM or reporting service) then it's worth investing in a proper DBA designed database and schema - it will allow you and the DBA to optimise and independently update the database for performance. That means using views over the raw tables, and using native SQL queries, and building an independent data layer.
    You do miss out on the IDE helper features against the raw database tables. But you them move this data into native classes anyway and gain all that back in the logical data layer above the physical data layer.
    However, if you're DB backend is not too heavy and complicated, then use an ORM to 'spin up a data store' and get moving quickly - and allow you to focus on the end-user functionality.
    DB migrations are never easy - and trying to be DB independent is usually a poor choice.

  • @bn_ln
    @bn_ln Рік тому

    Curious to know from those using ORMs if mapped columns are common

  • @henrikolsen5
    @henrikolsen5 8 місяців тому

    I would like input on how to construct hierarchical data structures when joining relation tables. Say I have a one-to-many relationship and would like the many-part to be a list on level down of the parent it belongs to. How to best get an SQL-result into this structure in Python (automatically, or close to it)?

  • @innstikk
    @innstikk Рік тому

    I like Sqlalchemy as it gives you ORM and Core so you can choose to do SQL with Core if you need it for something more complex than is practical with the ORM.

  • @Mesquita2987
    @Mesquita2987 Рік тому

    Are there best standards for testing database calls?

  • @user-bk5xo1gj7k
    @user-bk5xo1gj7k 10 місяців тому

    Have worked with all 3 actually. At the end of day, question is what i want from the product i'm working on?
    raw SQL tend to be the fastest option and ORM the slowest. However, if you do not have a super time sensitive task, i'd stick to ORM. When you are working on a massive codebase, the last thing you want is the ugly complexity of raw sql. debugging is a massive pain.
    query builders are pretty good, but a bit too verbose for me personally. If i'm working with rails, i'd absolutely stick to ORM Active Record. Nothing beats the comfort that it provides. If django, i'd go for a query builder. And for nodejs, once again, query builder. I don't know any good ORM for node though so that's a reason and knex is pretty good.

  • @walid7189
    @walid7189 4 місяці тому

    lets say I updated my orm database structure, how do I get it to upgrade and make the required changes in the database ?

  • @mehdi-vl5nn
    @mehdi-vl5nn Рік тому

    What is lost is the use of SQLite itself. For other DBMSs, they provide a driver which is usually a dynamic C library. This library may be written differently depending on the different standards for defining APIs or it may be a custom API for the database itself, such as ODBC, etc. Eventually, this API can be used with a protocol, for example, when connecting to a certain database, you need to send this URL and the username and password.
    But for SQLite, interestingly, the driver itself is part of the database

  • @d0cx
    @d0cx Рік тому +1

    I didn't know something like a query builder existed. I've never really been a fan of SQLAlchemy as it just seems so overly complicated. I've used Peewee a little bit, and it seems much cleaner and more Pythonic.

  • @DevlogBill
    @DevlogBill Рік тому

    Hi Arjan, about a year ago I was learning SQL with PostgreSQL and eventually MySQL. My first programming language was SQL before jumping onto python. My SQL is a bit rusty now I am learning Django's ORM and I must say personally I prefer raw SQL versus the ORM. The ORM doesn't feel as powerful as SQL from MySQL or POSTGRESQL. Now the question is, how can I use a SQL database on my Django project versus using an ORM? I would prefer to open up the MySQL and creating the database, tables and rows myself versus using an ORM for my project, but I haven't figured it out yet. Thanks for the video.

  • @TheMrSnuSnu
    @TheMrSnuSnu Рік тому

    If there are multiple dataset that needs to be merged (which is often the case since you use relational tables to optimise a database), I always stick with Raw SQL. I also find time zone manipulation a huge pain in any scripting language whilst in SQL it typically a 1 line change.

  • @hY-ug8vn
    @hY-ug8vn Рік тому +4

    what do you think of sqlmodel?

  • @cfn3107
    @cfn3107 Рік тому +2

    raw sql and prepared statements

  • @rrestituti
    @rrestituti Рік тому

    I'm a data cientist and I use raw SQL. Now I am writing a internet app for my wife's company and deciding which approach I must use. And with your video I decided: raw SQL. ORM can't use all the potencials that a SGDB could give. Thanks for the video.

  • @franklehmann3449
    @franklehmann3449 Рік тому +1

    SQLmodel for me. I really wanted to like SQLAlquemy but we never became friends. Second favorite: Raw dogging the DB wit plain SQL.

  • @TonyBokas
    @TonyBokas Місяць тому

    Once you enter a project that uses ORM, you realize you have entered hell.

  • @rofgar
    @rofgar 8 місяців тому

    ORMs are harder to profile, debug and maintain in general.
    Usually you need to invest quite some time in learning them and their quirks, pitfalls hidden behind the abstraction. It looks like SQL, tastes like SQL, but it really isn't.
    Type Safe query builders are very good and a lot of the time really fast to master if you know the RAW staff, which you should anyway, even if you decide to use ORMs.
    Also when choosing ORMs you usually lose performance, sometimes very badly, and it is harder to pinpoint when and where.

  • @deepikameenakshisundaram1748

    I have odd issue, in my application one of procedure purpose will return data from previous record. This procedure never had any issues running on windows xp and sql 2000 server. But same procedure running on windows 10 and sql 2014 returns null character intermittently even though the previous record has valid data.
    Any suggestions how to identify the root for this issue? Tools,method, etc?

  • @thomashamilton564
    @thomashamilton564 7 місяців тому

    Your raw SQL had a LEFT join, but it looked like in SQLAlchemy you just used .join - are these the same? Or is that specific to the setup of your model classes?