I tried to extend the model a bit further but I guess Datetime is specified another way?
class Contribution(Base): __tablename__ = "civicrm_contribution" id = Column(Integer, primary_key=True) contact_id = Column(Integer, nullable=False) receive_date = Column(Datetime,nullable=False) total_amount = Column(Decimal(20), nullable=False) On Tuesday, August 20, 2019 at 3:59:55 PM UTC-4, Ira Fuchs wrote: > > OK, I made some progress (see screenshot). I don't need the full model to > be represented as I will not need many of the columns in each of the > tables. If I could flesh this out enough so that I can do the query posted > above I can probably use that as a template to move forward. > > On Monday, August 19, 2019 at 7:11:59 AM UTC-4, Peter Schutt wrote: >> >> 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/b7de0338-8301-4f12-b607-38ce29bbff63%40googlegroups.com.