>
> the default schema is what the SQLAlchemy dialect assumes will be the 
> effective schema name **when we do not state the schema name explicitly**

Ahh, now I understand! Thanks for the detailed explanation ;).

you write your own dialect that explicitly injects the schema name into SQL

Yes, this is what my database requires. I do the following now for my 
Progress OpenEdge database to set the schema:
def on_connect(self):
    def connect(con):
        cur = con.cursor()
        cur.execute("SET SCHEMA 'pub'")
        cur.close()
    return connect

Thanks a lot for your help!

On Monday, 22 May 2017 23:33:22 UTC+10, Mike Bayer wrote:
>
>
>
> On 05/21/2017 11:21 PM, ben4ever wrote: 
> >     if you refer to a table without a schema name, that's the schema it 
> >     will actually use 
> > 
> > Yes, and that's the problem. 
> > 
> > In my dialect's base.py I define the following method: 
> > | 
> > def _get_default_schema_name(self, connection): 
> >      return 'pub' 
> > 
> > | 
> > 
> > But the code sample mentioned in my first email yields the following 
> > SELECT *without* prefixing the column and table names with "pub": 
> > | 
> > 2017-05-18 16:26:51,151 INFO sqlalchemy.engine.base.Engine SELECT foo.f1 
> > FROM foo 
> > | 
> > 
> > I noticed that there is no handling to retrieve the dialect's 
> > default_schema_name from within the MetaData class in sql/schema.py but 
> > like I said I just don't know whether this is intended for a reason. 
>
>
> OK, let me try again to explain. 
>
>
> if you refer to a table without a schema name, that's the schema **it** 
>  >     will actually use 
>
>
> "**it**" here means **the database, implicitly**. 
>
>
> That is, the default schema is what the SQLAlchemy dialect assumes will 
> be the effective schema name **when we do not state the schema name 
> explicitly**. 
>
>
> Example.  On Postgresql, the default schema name is named "public". 
>
> Go to your Postgresql command line, run this statement: 
>
> psql > SELECT * FROM some_table 
>
> What schema is "some_table" in?  Answer: "public".  That's the default 
> schema.  We *did not state this name*. It is *implicit*.   SQLAlchemy 
> uses this name when you ask it a question like, "reflect the columns 
> from some_table".  When it queries system catalogs, the default schema 
> is no longer implicit, we need it. We use get_default_schema to know 
> what that name is. 
>
> The only way SQLAlchemy states the schema name in the query is if: 
>
> a. you include it in the Table() definition, e.g. Table(..., 
> schema='myschema') 
>
> b. You include it in the MetaData so that it is inherited by the Table, 
> e.g. MetaData(schema='myschema') 
>
> c. you write your own dialect that explicitly injects the schema name 
> into SQL.  If your database is unable to invoke SQL without all symbols 
> being schema-qualified, then you would need to do this.  It's not clear 
> what the actual problem is. 
>
>
>
>
>
>
> > 
> > On Friday, 19 May 2017 23:19:06 UTC+10, Mike Bayer wrote: 
> > 
> > 
> > 
> >     On 05/18/2017 08:42 PM, ben4ever wrote: 
> >      > I'm writing a Progress OpenEdge dialect and when experimenting 
> >     with the 
> >      > dialect's default_schema_name I noticed that it is not 
> automatically 
> >      > used when creating a MetaData object without specifying a schema. 
> >      > Here is an example where the SELECT statement does not include 
> the 
> >      > schema name specified in default_schema_name: 
> >      > | 
> >      > from urllib.parse import quote 
> >      > 
> >      > from sqlalchemy import create_engine, select, Table, Column, 
> >     Integer, 
> >      > MetaData 
> >      > import sqlalchemy_progress 
> >      > 
> >      > connect_string = 'progress:///?odbc_connect={}'.format(quote( 
> >      >     
> >       'DRIVER=progress;DB=bizcomm;HOST=hostname;PORT=1234;UID=admin')) 
> >      > engine = create_engine(connect_string, echo=True) 
> >      > 
> >      > metadata = MetaData() 
> >      > foo = Table('foo', metadata, 
> >      >      Column('f1', Integer), 
> >      >      Column('f2', Integer)) 
> >      > 
> >      > print(engine.connect().execute( 
> >      >          select([foo.c.f1]) 
> >      >      ).fetchall()) 
> >      > | 
> >      > 
> >      > Is this the intended behaviour? 
> > 
> >     yes.  the "default" schema means, the *database's* default schema. 
> >     that is, if you refer to a table without a schema name, that's the 
> >     schema it will actually use. 
> > 
> > 
> > 
> > 
> >      > 
> >      > -- 
> >      > 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 
> >     <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 <javascript:> 
> >      > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:> 
> <javascript:>>. 
> >      > To post to this group, send email to sqlal...@googlegroups.com 
> >     <javascript:> 
> >      > <mailto:sqlal...@googlegroups.com <javascript:>>. 
> >      > Visit this group at https://groups.google.com/group/sqlalchemy 
> >     <https://groups.google.com/group/sqlalchemy>. 
> >      > For more options, visit https://groups.google.com/d/optout 
> >     <https://groups.google.com/d/optout>. 
> > 
> > -- 
> > 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 <javascript:> 
> > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>. 
> > To post to this group, send email to sqlal...@googlegroups.com 
> <javascript:> 
> > <mailto:sqlal...@googlegroups.com <javascript:>>. 
> > Visit this group at https://groups.google.com/group/sqlalchemy. 
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
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 post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to