2012-05-04 30 views
7

tôi cần phải tạo ra một TRƯỚC INSERT trigger trong SQLAlchemy:DELIMITER/Tạo ra một kích hoạt trong 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 ; 

Thực thi mã trong mysql-workbench làm việc tốt, nhưng ám một "Bạn có một lỗi trong SQL của bạn cú pháp" ngoại lệ khi thực hiện trong mã thực tế của tôi:

from sqlalchemy.sql.expression import text 

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

Chạy SELECT SLEEP(1), CREATE TABLE test (id INT) hoặc thậm chí USE some_db công trình tốt.

này các thông báo lỗi mysql tôi nhận được:

(1064, "Bạn có một lỗi trong cú pháp SQL của bạn; ... gần 'DELIMITER | \ nTạo TRIGGER set_rank BE ...")

Tôi khá chắc chắn rằng tôi sử dụng DELIMITER không chính xác. Cú pháp đúng trong ngữ cảnh này là gì/Làm cách nào để khắc phục sự cố của tôi?

+1

Câu lệnh "DELIMETER" này có mục đích gì? Chỉ cần loại bỏ nó. – Gerrat

Trả lời

10

Bạn thực sự thành thật không cần DELIMITER. Thats chỉ cho khách hàng dòng lệnh. Bạn là một lập trình viên sẽ phân chia các câu lệnh, vì vậy các dấu phân tách được bỏ qua.

>>> 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, cảm ơn. Dường như tôi hiểu lầm cách SQL được phân tích cú pháp. : - / – kay

Các vấn đề liên quan