Cool, how about we walk through creating a model for your schema as an 
example. As we go I can point you to the relevant sections of the 
tutorials/docs as they are great and will explain the details much better 
than I can, and I'll try to address any questions you have along the way.

The first thing you need is your Base class, all of your ORM models will 
inherit from this:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


Your models need to inherit from Base, need a __tablename__ class attribute 
and at least a primary key column. For example, a class to represent your 
"db_contact" table might look like this:

from sqlalchemy import Column, Integer, String

class Contact(Base):

    __tablename__ = "db_contact"

    id = Column(Integer, primary_key=True)
    last_name = Column(String(20), nullable=False)
    first_name = Column(String(20), nullable=False)

Some things to note this far along:

   - In this example, the name of the Column in the database is inferred 
   from the name of the class attribute that the Column is assigned to.
   - Column constructors take arguments that define specifics of how the 
   column is defined in the database. E.g. `primary_key=True`, 
   `nullable=False`. By declaring a single integer column as primary key, it 
   will automatically be specified as autoincrement in the schema, as well as 
   the primary key. Setting nullable=False on other columns declares that a 
   NOT NULL constraint should be set on those columns.
   - As you are using MySQL, String types (which represent VARCHAR type in 
   the database) require a length. If you were creating models for other 
   backends such as SQLite or postgres, then that isn't required.

Nothing that I've covered here isn't covered in the early stages of the ORM 
Tutorial 
<https://docs.sqlalchemy.org/en/13/orm/tutorial.html#declare-a-mapping>. 
Also, you can read the Column API 
<https://docs.sqlalchemy.org/en/13/core/metadata.html#sqlalchemy.schema.Column> 
to 
get a feel for the arguments that you can pass to Column in order to define 
your schema.

One more important element is the Foreign Key. I'll use your 
"db_entity_tag" table to give you an example of that:

from sqlalchemy import ForeignKey

class EntityTag(Base):

    __tablename__ = "db_entity_tag"

    id = Column(Integer, primary_key=True)
    entity_id = Column(
        Integer, 
        ForeignKey('db_contact.id', ondelete="CASCADE"), 
        nullable=False,
    )

Pass the name of the related column to the ForeignKey object (note that 
this isn't "Class.attributename", it is "tablename.columnname") and pass 
the ForeignKey object as a positional argument to the Column constructor 
_after_ the column type argument. ForeignKey api is documented here 
<https://docs.sqlalchemy.org/en/13/core/constraints.html#sqlalchemy.schema.ForeignKey>
 and 
touched on in the orm tutorial here 
<https://docs.sqlalchemy.org/en/13/orm/tutorial.html#building-a-relationship>
.

Have a go at filling in the columns that I've missed in those models above 
and defining the rest of the tables in your schema and once you get that 
done we can move on. Happy to try to answer any questions you might have 
along the way.


On Monday, 19 August 2019 12:36:21 UTC+10, Ira Fuchs wrote:
>
> Thanks for your reply and offer to help. I am able to create an Engine and 
> connect to the MySQL db. I can execute simple sql queries although I wasn't 
> able to get the query I posted to work due to a syntax error (probably 
> having to do with the quotes). I have not mapped any tables to classes.
>
> On Sunday, August 18, 2019 at 8:54:57 PM UTC-4, Peter Schutt wrote:
>>
>> Hi Ira, I'd be happy to help you find your feet with the SQLAlchemy ORM.
>>
>> In general when creating an application that uses the SQLAlchemy ORM, you 
>> would start with an Engine (for connecting to the db), a declarative base 
>> class (maps db table to python class) and a Session instance (for using a 
>> connection to issue queries). Do you have any familiarity with those 
>> concepts?
>>
>>
>> On Monday, 19 August 2019 02:34:05 UTC+10, Ira Fuchs wrote:
>>>
>>> I am new to sqlalchemy and I would like to begin using it to create 
>>> scripts with some sql queries that I have been using but need to change 
>>> from time to time. It would help a lot if someone could translate one of 
>>> these queries to python sqlalchemy using an ORM (not simply executing the 
>>> query as is) so that I could use this as a template for other queries, or 
>>> at least learn from it.
>>>
>>> One of my queries looks like this:
>>>
>>> SELECT DISTINCT last_name, first_name, street_address, city, a.name, 
>>> postal_code, f.name as country FROM db_contact c, db_entity_tag d , 
>>> db_address e, db_state_province a, db_country f WHERE c.id = 
>>> d.entity_id and tag_id = 6 and c.id = e.contact_id AND 
>>> state_province_id = a.id  and e.country_id = f.id and  display_name not 
>>> in ( SELECT display_name FROM db_contribution, db_contact c, db_entity_tag 
>>> d WHERE receive_date > '2005-07-01' and contact_id = c.id and c.id = 
>>> entity_id and tag_id = 6 )
>>>
>>> Thanks for any help.
>>>
>>>

-- 
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/e32e470c-5e06-45fd-a6c3-e768b587c31e%40googlegroups.com.

Reply via email to