2012-05-04 5 views
7

bir tetikleyici oluşturma ÖNCE sqlalchemy içinde trigger INSERT: mysql-tezgah kodu yürütülmesiDELIMITER/I oluşturmak için gereken sqlalchemy

DELIMITER | 
CREATE TRIGGER set_rank BEFORE INSERT ON authors 
FOR EACH ROW BEGIN 
    IF NEW.rank = 0 THEN 
     SET NEW.rank = (SELECT IFNULL(MAX(a.rank),0) + 1 
         FROM authors AS a 
         WHERE a.id = NEW.pub_id); 
    END IF; 
END | 
DELIMITER ; 

gayet güzel çalışıyor, ama bir "Sen SQL bir hata var kılan benim asıl kodunda yürütülen sözdizimi" istisna:

from sqlalchemy.sql.expression import text 

connection = db.session.connection() 
text(..., connection).execute(); 

gayet SELECT SLEEP(1), CREATE TABLE test (id INT) hatta USE some_db işleri yayınlanıyor.

|;

(1064, "nbir TRIGGER BE set_rank \ ... ... yakın 'DELIMITER Eğer SQL sözdizimi bir hata var"):

MySQL hata mesajı alıyorum Bu

DELIMITER ürününü yanlış kullandığımı kesinlikle biliyorum. Bu bağlamda doğru sözdizimi nedir/Sorunumu nasıl giderebilirim?

+1

Bu "DELIMETER" ifadesi ne işe yarar? Sadece kaldır onu. – Gerrat

cevap

10

Gerçekten dürüst olmak gerekirse DELIMITER. Bu sadece komut satırı istemcisi için geçerlidir. Bir programcı olarak ifadeleri bölersiniz, böylece sınırlayıcılar aksi halde göz ardı edilir.

>>> from sqlalchemy import * 
>>> 
>>> trigger_text = """ 
... CREATE TRIGGER set_rank BEFORE INSERT ON authors 
... FOR EACH ROW BEGIN 
...  IF NEW.rank = 0 THEN 
...   SET NEW.rank = (SELECT IFNULL(MAX(a.rank),0) + 1 
...       FROM authors AS a 
...       WHERE a.id = NEW.pub_id); 
...  END IF; 
... END 
... """ 
>>> 
>>> metadata = MetaData() 
>>> authors = Table("authors", metadata, 
...  Column("id", Integer, primary_key=True), 
...  Column("rank", Integer), 
...  Column("pub_id", Integer)) 
>>> 
>>> engine = create_engine("mysql://[email protected]/test", echo=True) 
>>> authors.create(engine) 
2012-05-04 17:11:41,093 INFO sqlalchemy.engine.base.Engine 
CREATE TABLE authors (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    rank INTEGER, 
    pub_id INTEGER, 
    PRIMARY KEY (id) 
) 


2012-05-04 17:11:41,093 INFO sqlalchemy.engine.base.Engine() 
2012-05-04 17:10:51,376 INFO sqlalchemy.engine.base.Engine COMMIT 
>>> engine.execute(trigger_text) 
2012-05-04 17:11:41,159 INFO sqlalchemy.engine.base.Engine 
CREATE TRIGGER set_rank BEFORE INSERT ON authors 
FOR EACH ROW BEGIN 
    IF NEW.rank = 0 THEN 
     SET NEW.rank = (SELECT IFNULL(MAX(a.rank),0) + 1 
         FROM authors AS a 
         WHERE a.id = NEW.pub_id); 
    END IF; 
END 

2012-05-04 17:11:41,159 INFO sqlalchemy.engine.base.Engine() 
2012-05-04 17:11:41,312 INFO sqlalchemy.engine.base.Engine COMMIT 
<sqlalchemy.engine.base.ResultProxy object at 0x2be1ed0> 
>>> 
+0

Ah, teşekkürler. SQL'in nasıl ayrıştırıldığını yanlış anlamış gibi görünüyor. : - / – kay