Hi there,

This is great.  Thanks for adding to the discussion.

Rgds

mjg

On Thursday, November 2, 2023 at 11:13:07 AM UTC-4 mkmo...@gmail.com wrote:

> Hi Mike,
>
> If I understand correctly, you want to work with raw sql and don't want 
> any ORM getting in your way. I'm the same way, and it is trivial to use 
> SQLAlchemy Core for this purpose.
>
> results = conn.execute(text('select foo, bar from 
> baz')).mappings().fetchall()  # mappings().fetchall() returns a list of 
> dict like objects
> for row in results:
>     print(row['foo'], row['bar'])
>
> result = conn.execute(text('select foo, bar from baz')).fetchall()  # 
> fetchall() without mappings() returns a list of named tuple like objects
> for row in results:
>     print(row.foo, row.bar)
>     print(row[0], row[1])
>
> On Thursday, August 24, 2023 at 5:06:11 AM UTC-7 Mike Graziano wrote:
>
>> 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/48f4eff5-7b26-41aa-bd94-a3d665ed9268n%40googlegroups.com.

Reply via email to