No problem, here it is. To work with your initial code example...
>>> e =
create_engine("mysql+pymysql://jens@localhost/test?charset=utf8&unix_socket=/opt/local/var/run/mysql56/mysqld.sock",
echo=True)
>>> Base.metadata.drop_all(e)
2017-11-28 06:47:21,171 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES
LIKE 'sql_mode'
2017-11-28 06:47:21,171 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:21,173 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2017-11-28 06:47:21,173 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:21,174 INFO sqlalchemy.engine.base.Engine show collation
where `Charset` = 'utf8' and `Collation` = 'utf8_bin'
2017-11-28 06:47:21,174 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:21,175 INFO sqlalchemy.engine.base.Engine SELECT
CAST('test plain returns' AS CHAR(60)) AS anon_1
2017-11-28 06:47:21,175 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:21,176 INFO sqlalchemy.engine.base.Engine SELECT
CAST('test unicode returns' AS CHAR(60)) AS anon_1
2017-11-28 06:47:21,176 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:21,176 INFO sqlalchemy.engine.base.Engine SELECT
CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin
AS anon_1
2017-11-28 06:47:21,176 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:21,177 INFO sqlalchemy.engine.base.Engine DESCRIBE `tokens`
2017-11-28 06:47:21,177 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:21,179 INFO sqlalchemy.engine.base.Engine ROLLBACK
>>> Base.metadata.create_all(e)
2017-11-28 06:47:23,490 INFO sqlalchemy.engine.base.Engine DESCRIBE `tokens`
2017-11-28 06:47:23,490 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:23,495 INFO sqlalchemy.engine.base.Engine ROLLBACK
2017-11-28 06:47:23,496 INFO sqlalchemy.engine.base.Engine
CREATE TABLE tokens (
id VARCHAR(50) NOT NULL,
user_id VARCHAR(50),
client_sig VARCHAR(50),
PRIMARY KEY (id)
)
2017-11-28 06:47:23,496 INFO sqlalchemy.engine.base.Engine {}
2017-11-28 06:47:23,507 INFO sqlalchemy.engine.base.Engine COMMIT
>>> stmt = select([
... literal_column("'abc'"),
... literal_column("'def'"),
... literal_column("'ghi'"),
... ]).where(
... ~exists().where(and_(Token.user_id == 'def', Token.client_sig ==
'ghi'))
... )
>>>
>>> print(stmt)
SELECT 'abc', 'def', 'ghi'
WHERE NOT (EXISTS (SELECT *
FROM tokens
WHERE tokens.user_id = :user_id_1 AND tokens.client_sig = :client_sig_1))
OK I don't recall what conditions MySQL needs "FROM dual" can you share
> with me:
>
> 1. the full version of MySQL
>
>>> e.dialect.name, e.dialect.driver, e.dialect.server_version_info
('mysql', 'pymysql', (5, 6, 34))
2. the output of "SHOW VARIABLES LIKE '%SQL_MODE%'
>
>
mysql> show variables like '%sql_mode%';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| sql_mode | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+
1 row in set (0.00 sec)
3. stack trace + error message
>
>>> e.execute(
... insert(Token).from_select(['id', 'user_id', 'client_sig'], stmt)
... )
2017-11-28 06:47:49,489 INFO sqlalchemy.engine.base.Engine INSERT INTO
tokens (id, user_id, client_sig) SELECT 'abc', 'def', 'ghi'
WHERE NOT (EXISTS (SELECT *
FROM tokens
WHERE tokens.user_id = %(user_id_1)s AND tokens.client_sig =
%(client_sig_1)s))
2017-11-28 06:47:49,489 INFO sqlalchemy.engine.base.Engine {'client_sig_1':
'ghi', 'user_id_1': 'def'}
2017-11-28 06:47:49,491 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line
1182, in _execute_context
context)
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line
470, in do_execute
cursor.execute(statement, parameters)
File "/…/lib/python3.5/site-packages/pymysql/cursors.py", line 166, in
execute
result = self._query(query)
File "/…/lib/python3.5/site-packages/pymysql/cursors.py", line 322, in
_query
conn.query(q)
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 856,
in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 1057,
in _read_query_result
result.read()
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 1340,
in read
first_packet = self.connection._read_packet()
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 1014,
in _read_packet
packet.check_error()
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 393,
in check_error
err.raise_mysql_exception(self._data)
File "/…/lib/python3.5/site-packages/pymysql/err.py", line 107, in
raise_mysql_exception
raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the
right syntax to use near 'WHERE NOT (EXISTS (SELECT * \nFROM tokens \nWHERE
tokens.user_id = 'def' AND token' at line 2")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line
2064, in execute
return connection.execute(statement, *multiparams, **params)
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line
945, in execute
return meth(self, multiparams, params)
File "/…/lib/python3.5/site-packages/sqlalchemy/sql/elements.py", line
263, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line
1053, in _execute_clauseelement
compiled_sql, distilled_params
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line
1189, in _execute_context
context)
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line
1402, in _handle_dbapi_exception
exc_info
File "/…/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line
203, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "/…/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line
186, in reraise
raise value.with_traceback(tb)
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line
1182, in _execute_context
context)
File "/…/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line
470, in do_execute
cursor.execute(statement, parameters)
File "/…/lib/python3.5/site-packages/pymysql/cursors.py", line 166, in
execute
result = self._query(query)
File "/…/lib/python3.5/site-packages/pymysql/cursors.py", line 322, in
_query
conn.query(q)
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 856,
in query
self._affected_rows = self._read_query_result(unbuffered=unbuffered)
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 1057,
in _read_query_result
result.read()
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 1340,
in read
first_packet = self.connection._read_packet()
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 1014,
in _read_packet
packet.check_error()
File "/…/lib/python3.5/site-packages/pymysql/connections.py", line 393,
in check_error
err.raise_mysql_exception(self._data)
File "/…/lib/python3.5/site-packages/pymysql/err.py", line 107, in
raise_mysql_exception
raise errorclass(errno, errval)
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1064, "You
have an error in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near 'WHERE NOT (EXISTS
(SELECT * \nFROM tokens \nWHERE tokens.user_id = 'def' AND token' at line
2") [SQL: "INSERT INTO tokens (id, user_id, client_sig) SELECT 'abc',
'def', 'ghi' \nWHERE NOT (EXISTS (SELECT * \nFROM tokens \nWHERE
tokens.user_id = %(user_id_1)s AND tokens.client_sig = %(client_sig_1)s))"]
[parameters: {'client_sig_1': 'ghi', 'user_id_1': 'def'}]
Please let me know of anything else you need from me!
Jens
--
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.