Edgaras Lukoševičius <edgaras.lukosevic...@gmail.com> wrote:

> A quick script with SQL table schema.

won’t work with MySQL. The ability to send a pure string SQL statement
directly to execute() in conjunction with a straight tuple, and have it
magically expand out to an IN, is a psycopg2 / postgresql specific feature.

> If tuple is a hack, then how should I it work with the same logic, but 
> without tuple? Construct a string from tuple? I'm afraid that will be double 
> quoted (sanitized) too.

The SQLAlchemy Core is designed to produce SQL strings on the fly. You need
only call “column.in_(collection)” and the correct IN clause with bound
parameters will be generated dynamically.

see below:

from sqlalchemy import create_engine, select, Table, MetaData
from sqlalchemy.orm import sessionmaker

#engine = create_engine('mysql://root@localhost/preferences', echo=False)
engine = create_engine('mysql://scott:tiger@localhost/test', echo=True)

engine.execute("""
CREATE TABLE if not exists `preferences` (
 `recipient` varchar(255) COLLATE latin1_general_ci NOT NULL,
 `col1` tinyint(1) NOT NULL DEFAULT '1',
 `col2` tinyint(1) NOT NULL DEFAULT '1',
 `col3` tinyint(1) NOT NULL DEFAULT '1',
 PRIMARY KEY (`recipient`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
""")

m = MetaData()
t = Table("preferences", m, autoload=True, autoload_with=engine)

Session = sessionmaker(bind=engine)
session = Session()


recipients1 = ["recipient1"]
recipients2 = ["recipient1", "recipient2", "recipient3"]

sql_query = select([t.c.col1, t.c.col2, t.c.col3])

user_configs = \
    session.execute(sql_query.where(t.c.recipient.in_(recipients1))).fetchall()

print(user_configs)

user_configs = \
    session.execute(sql_query.where(t.c.recipient.in_(recipients2))).fetchall()


print(user_configs)


output:

BEGIN (implicit)
2015-03-23 16:08:57,188 INFO sqlalchemy.engine.base.Engine SELECT 
preferences.col1, preferences.col2, preferences.col3 
FROM preferences 
WHERE preferences.recipient IN (%s)
2015-03-23 16:08:57,188 INFO sqlalchemy.engine.base.Engine ('recipient1',)
[]
2015-03-23 16:08:57,189 INFO sqlalchemy.engine.base.Engine SELECT 
preferences.col1, preferences.col2, preferences.col3 
FROM preferences 
WHERE preferences.recipient IN (%s, %s, %s)
2015-03-23 16:08:57,189 INFO sqlalchemy.engine.base.Engine ('recipient1', 
'recipient2', 'recipient3')
[]






> from sqlalchemy import create_engine
> from sqlalchemy.orm import sessionmaker
> 
> engine = create_engine('mysql://root@localhost/preferences', echo=False)
> 
> Session = sessionmaker(bind=engine)
> session = Session()
> 
> #CREATE TABLE `preferences` (
> # `recipient` varchar(255) COLLATE latin1_general_ci NOT NULL,
> # `col1` tinyint(1) NOT NULL DEFAULT '1',
> # `col2` tinyint(1) NOT NULL DEFAULT '1',
> # `col3` tinyint(1) NOT NULL DEFAULT '1',
> # PRIMARY KEY (`recipient`)
> #) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
> 
> 
> recipients1=["recipient1"]
> recipients2=["recipient1","recipient2","recipient3"]
> 
> sql_query="SELECT col1, col2, col3 FROM preferences WHERE recipient IN 
> :recipients"
> 
> # multi value array
> # this fail because of double quotes
> user_configs = session.execute(sql_query, 
> dict(recipients=tuple(recipients2))).fetchall()
> print user_configs
> 
> # single value array
> # this fails because of mysql syntax errox (tuple inserted incorrectly)
> user_configs = session.execute(sql_query, 
> dict(recipients=tuple(recipients1))).fetchall()
> print user_configs
> 
> 
> 
>  
> 
> 2015 m. kovas 23 d., pirmadienis 16:45:48 UTC+2, Edgaras Lukoševičius rašė:
> Hello,
> 
> as I'm not receiving any responses in stackoverflow I wil try here. Can 
> someone help me with this issue?
> 
> http://stackoverflow.com/questions/29195825/sqlalchemy-double-quoting-list-items
> 
> -- 
> 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 http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to