SqlAlchemy OperationalError с использованием Case - PullRequest
1 голос
/ 04 марта 2012

Это немного кода, который я пишу для плагина для небольшого количества программного обеспечения (Anki).

for i in date:
    self.deck.s.execute(
    """CASE WHEN EXISTS(SELECT * FROM :table WHERE day=date( :i )) THEN
         UPDATE :table SET WHERE day=date(:i)
       ELSE
         INSERT INTO :table (day, matureRise) VALUES ( date( :i ),1)
       END""", {'table':STATSTABLE,'i':i})

Проблема в том, что он продолжает выдавать ошибку OperationalError. Конкретно получаю:

sqlalchemy.engine.default", line 299, in do_execute
OperationalError: (OperationalError) near "CASE": syntax error u'CASE WHEN EXISTS(SELECT * FROM ? WHERE day=date( ? )) THEN\nUPDATE ? SET WHERE day=date(?)\nELSE\nINSERT INTO ? (day, matureRise) VALUES ( date( ? ),1) END' ('stats_2', (u'2011-05-03',), 'stats_2', (u'2011-05-03',), 'stats_2', (u'2011-05-03',))

Я пробовал несколько вещей, но я не смог понять, что не так. Я не очень знаком с sqlalchemy, поэтому мне интересно, может быть, есть какой-то нюанс в подаче сырого SQL, который мне не хватает.

1 Ответ

0 голосов
/ 05 марта 2012

Попробуйте это

from sqlalchemy import create_engine

engine = create_engine('mysql://test:test@localhost/test', echo=True)
from sqlalchemy.orm import sessionmaker

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Date, Column, Integer


Base = declarative_base()



class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True, autoincrement=True)
    day = Column(Date, unique=True)


if __name__ == '__main__':

    Base.metadata.create_all(engine)
    c = engine.connect()
    c.execute("""INSERT INTO users(day) VALUES ('2012-03-05') ON DUPLICATE KEY UPDATE day='2012-03-04'""")

Когда я запускаю этот файл первый раз, я получаю журнал как

2012-03-05 12:39:42,202 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2012-03-05 12:39:42,202 INFO sqlalchemy.engine.base.Engine ()
2012-03-05 12:39:42,204 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%'
2012-03-05 12:39:42,204 INFO sqlalchemy.engine.base.Engine ()
2012-03-05 12:39:42,205 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
2012-03-05 12:39:42,205 INFO sqlalchemy.engine.base.Engine ()
2012-03-05 12:39:42,206 INFO sqlalchemy.engine.base.Engine SHOW COLLATION
2012-03-05 12:39:42,206 INFO sqlalchemy.engine.base.Engine ()
2012-03-05 12:39:42,209 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2012-03-05 12:39:42,209 INFO sqlalchemy.engine.base.Engine ()
2012-03-05 12:39:42,210 INFO sqlalchemy.engine.base.Engine DESCRIBE `users`
2012-03-05 12:39:42,210 INFO sqlalchemy.engine.base.Engine ()
2012-03-05 12:39:42,211 INFO sqlalchemy.engine.base.Engine INSERT INTO users(day) VALUES ('2012-03-05') ON DUPLICATE KEY UPDATE day='2012-03-04'
2012-03-05 12:39:42,211 INFO sqlalchemy.engine.base.Engine ()
2012-03-05 12:39:42,212 INFO sqlalchemy.engine.base.Engine COMMIT

Затем я проверяю в базе данных

mysql> select * from users;
+----+------------+
| id | day        |
+----+------------+
|  8 | 2012-03-05 |
+----+------------+
1 row in set (0.00 sec)

Тогда яснова запустите программу

и снова проверьте mysql.

mysql> select * from users;
+----+------------+
| id | day        |
+----+------------+
|  8 | 2012-03-04 |
+----+------------+
1 row in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...