Hi Simon,
Thanks for responding to my post. It turns out that MyBatis can do exactly what you are saying which essentially sounds like a bulk ETL process. Again, the key difference is that MyBatis doesn’t require that the mapping be done with all the DB-specific definitions which I frankly prefer. There is a tool, the MyBatis generator, that does exactly this and I have used it when I didn’t want to write my own mapping files since the tables had hundreds of fields. In many cases, you are correct in that I was only loading data. The data was retrieved by raw SQL and could involve joins with other tables much as in a view. I just needed a data transfer mechanism to translate the SQL results to a POJO. Your experience differed in that you did need to create the tables with your Python code. I agree that SQLAlchemy is perfect for that. I created the tables ahead of time usually with command-line psql or, as you said, the tables already existed. In fact, I’d sometimes create temp tables with the schema of existing tables and I also did that with command-line psql in a Bash script. Thanks for your insights. Rgds mjg On Wednesday, August 23, 2023 at 12:49:23 PM UTC-4 Simon King wrote: > My perspective: the SQLAlchemy ORM really comes into its own when you are > making use of its Unit of Work system to load a batch of objects from the > database, manipulate those objects, and then flush your changes back to the > database. If you are only *loading* data then you don't need a lot of the > functionality of the ORM, and you might consider using SQLAlchemy Core > instead. > > Using SQLAlchemy Core to execute SQL strings is very simple: > > https://docs.sqlalchemy.org/en/20/core/connections.html#basic-usage > > You can use the objects that come back from those calls directly (they > have attributes named after the columns from the query), or you could > trivially convert them into instances of some class that you've defined. > > It sounds like the sort of work you do involves writing code to access > pre-existing databases, in which case writing SQL directly makes a lot of > sense, and you have no need for the schema-definition parts of SQLAlchemy. > But there are other classes of application for which the schema-definition > tools are very useful. I have written many applications for which the > database didn't already exist, so allowing SQLAlchemy to create the tables > was the obvious way to go (with Alembic for migrations as the schema > changed over time). SQLAlchemy also gives a certain amount of independence > from the underlying database, meaning that I can run most of my tests using > SQLite despite using Postgres or MySQL in production. > > In summary: use the right tool for the job :-) > > Simon > > > On Mon, Aug 21, 2023 at 6:48 PM Mike Graziano <mjg2...@gmail.com> wrote: > >> Hi Mike, >> >> >> >> Thanks for that info. It was just what I needed. I also want to thank >> you for your YouTube tutorials on SQLAlchemy. They are fantastic. >> >> >> >> I don’t want to make this a huge post, but I have a real pet peeve >> concerning ORMs. I come from a Java background where I used MyBatis as my >> ORM. What I love about MyBatis was >> >> >> >> - I could use raw SQL which I personally feel is superior. My >> argument here is simple: Why learn another “language” for issuing SQL >> statements when we have already spent a fair amount of time learning SQL. >> Also, raw SQL is easily testable with either command line or GUI tools? >> >> - The ORM should just use the mapped models in order to execute SQL >> using mapping that in and of themselves doesn’t/shouldn’t care about the >> tables. Unless you are creating a table with the ORM which I have found to >> be rare, the ORM shouldn’t care about the table structure other than field >> names with the possibility of aliases and data types. Why define more than >> what we need in order to populate a plain old object (POO – language >> agnostic). Why include characteristics like primary key, nullability, >> etc? Some Pydantic-like validation is handy, but can be table agnostic. >> Let’s extract the data via SQL and return POOs. In that regard, I liken >> the ORM to a Data Transfer Object (DTO). >> >> - As I have already mentioned, how often do you really use an >> application to create tables. Often, they already exist. Furthermore, it >> is just more natural to use command‑line SQL or a GUI to create the >> tables. In fact, it is not uncommon to use a GUI like PgAdmin or DBeaver >> to create the database elements that you need and then use that tool to >> derive all sorts of scripts to perform common activities such as backup, >> restore, etc. that can be scheduled. >> >> >> >> There is a very handy Java framework call BeanIO ( http://beanio.org/) >> that I feel exemplifies the points I am trying to make. With BeanIO, it is >> possible to extract data from a variety of file formats and populate >> POJOs. BeanIO is only interested in the layout of the data. It is a >> convenience framework that allows for OOP design of an application. I feel >> that MyBatis does this also. It has substantial DB integration, but >> strives to connect the POJO to the database without enforcing design. >> Using so-called Entity’s enforces a design that ORMs should not be forced >> to obey if all you are looking for is a translation from SQL to a POO. >> >> >> >> Once again, thanks for you help and sorry for my ranting, but as I’ve >> said I have a pet peeve with ORMs that are enforcing more than I think is >> necessary to translate SQL to a POO. >> >> On Thursday, August 17, 2023 at 8:04:58 PM UTC-4 Mike Bayer wrote: >> >>> the raw SQL to ORM mapping pattern has a lot of limitations but it is >>> documented at >>> https://docs.sqlalchemy.org/en/20/orm/queryguide/select.html#getting-orm-results-from-textual-statements >>> >>> . >>> >>> >>> >>> On Thu, Aug 17, 2023, at 4:26 PM, Mike Graziano wrote: >>> >>> To all, >>> >>> I am new to Python and SQLAlchemy. I was a Java developer who used the >>> MyBatis ORM. I was using PONY ORM for a while, but was concerned that >>> SQLAlchemy is the gold standard for ORMs and Python, but there is something >>> about MyBatis that I can't seem to find in SQLAlchemy, but maybe I have not >>> googled enough. >>> >>> In short, I don't want to use SQLAlchemy's select. I want to issue raw >>> SQL and have SQLAlchemy's ORM capability populate a collection of objects. >>> That may not be pythonic, but I'd like to know how to do it with >>> declarative mapping. Is it possible and, if so, I'd love to see an >>> example. >>> >>> Thx & rgds >>> >>> mjg >>> >>> >>> -- >>> SQLAlchemy - >>> The Python SQL Toolkit and Object Relational Mapper >>> >>> http://www.sqlalchemy.org/ >>> >>> To post example code, please provide an MCVE: Minimal, Complete, and >>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >>> description. >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "sqlalchemy" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to sqlalchemy+...@googlegroups.com. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sqlalchemy/17383085-4a83-49d0-bf0a-1653552b7d59n%40googlegroups.com >>> >>> <https://groups.google.com/d/msgid/sqlalchemy/17383085-4a83-49d0-bf0a-1653552b7d59n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >>> >>> -- >> SQLAlchemy - >> The Python SQL Toolkit and Object Relational Mapper >> >> http://www.sqlalchemy.org/ >> >> To post example code, please provide an MCVE: Minimal, Complete, and >> Verifiable Example. See http://stackoverflow.com/help/mcve for a full >> description. >> --- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to sqlalchemy+...@googlegroups.com. >> > To view this discussion on the web visit >> https://groups.google.com/d/msgid/sqlalchemy/105bbc06-869b-4512-ad51-5a6ab6ea3eb7n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/sqlalchemy/105bbc06-869b-4512-ad51-5a6ab6ea3eb7n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/25dad1de-19ff-4d09-b753-9e066da934abn%40googlegroups.com.