【发布时间】:2018-05-14 23:54:31
【问题描述】:
我在大学的一个 DJANGO 项目中使用 SQLSERVER 作为数据库,我需要通过 DJANGO 触发我的触发器和程序,我一直在寻找几天来做这个,但我做不到,谁能帮助我?
【问题讨论】:
标签: sql-server django stored-procedures triggers
我在大学的一个 DJANGO 项目中使用 SQLSERVER 作为数据库,我需要通过 DJANGO 触发我的触发器和程序,我一直在寻找几天来做这个,但我做不到,谁能帮助我?
【问题讨论】:
标签: sql-server django stored-procedures triggers
如果其他人最终出现在此页面上,这就是我设法做到这一点的方式......我对这个问题的解释是如何在数据库端对数据库触发器函数进行操作。我的数据库后端是 PostgreSQL,但 SQL 是一个标准,对 MySQL 和其他的查询应该差不多)。
解决方案比较简单。一旦你做了你的第一个
python manage.py makemigrations
python manage.py migrate
转到您选择的数据库管理器并查找生成您希望在其上使用触发器的表的 SQL 查询。
例如,您的public.auth.users 表创建查询可能如下所示:
CREATE TABLE public.auth_user
(
id integer NOT NULL DEFAULT nextval('auth_user_id_seq'::regclass),
password character varying(128) COLLATE pg_catalog."default" NOT NULL,
last_login timestamp with time zone,
is_superuser boolean NOT NULL,
username character varying(150) COLLATE pg_catalog."default" NOT NULL,
first_name character varying(30) COLLATE pg_catalog."default" NOT NULL,
last_name character varying(150) COLLATE pg_catalog."default" NOT NULL,
email character varying(254) COLLATE pg_catalog."default" NOT NULL,
is_staff boolean NOT NULL,
is_active boolean NOT NULL,
date_joined timestamp with time zone NOT NULL,
CONSTRAINT auth_user_pkey PRIMARY KEY (id),
CONSTRAINT auth_user_username_key UNIQUE (username)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;
假设您想要一个触发器,将每条新记录的 last_name 更改为值“Trump”(不带引号)。创建触发函数的代码如下所示(注意RAISE NOTICE 行只是将信息回显到 SQL 终端以进行调试。您可以通过在它们前面添加双破折号来将它们注释掉,例如 --RAISE NOTICE 'id = % ', NEW.id;):
CREATE OR REPLACE FUNCTION trumpisizer() RETURNS trigger AS $$
BEGIN
RAISE NOTICE 'last_name = % ', NEW.last_name;
NEW.last_name = 'Trump';
RAISE NOTICE 'last_name = % ', NEW.last_name;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
现在您需要将您的函数绑定到您的表。这样做的 SQL 查询是这样的:
CREATE TRIGGER trumpist BEFORE INSERT ON auth_user FOR EACH ROW EXECUTE PROCEDURE trumpisizer();
现在加载您的 django 应用并创建一个新用户。每个新用户的 last_name 都将更改为新值。
【讨论】:
稍微偏离主题的建议,请见谅。
为什么不使用 Flask。 Django 的强大功能主要在其框架内发挥作用。您使用 models.py 构建数据库。您通过框架执行迁移,并利用它通过自定义中间件或信号进行数据操作。
如果您的数据库已经为您完成了很多繁重的工作,那么使用较少的“包含电池”框架(如 Django)并使用烧瓶或瓶子可能会更容易。如果它是针对不需要企业功能或稳定性的大学项目,则尤其如此。通过一些不太明确的框架可能更容易破解和削减。如果临近学期末,学习 Django 可能是一项艰巨的任务。
【讨论】:
我只是要回答这个问题,但可以根据经验告诉您,您可能正在走一些远离最佳实践的道路。如果这将成为一个永久性项目,您可能需要进行更多挖掘;如果它是一个学习练习,那也很酷!
回答:Django 是用 Python 编写的。您可以使用pyodbc 从 Python 触发 SQL Server 中的存储过程。要将 SQL Server 与 Django 的 ORM 一起使用,您需要使用 Django 引擎,例如 django-pyodbc-azure(使用 pip install django-pyodbc-azure 安装),它还将安装 pyodbc。如果您在 Linux 或 Mac 上运行 Django,您还需要与 SQL Server 兼容的 ODBC 驱动程序,例如 MS ODBC 驱动程序或 FreeTDS(有关在 Linux 上安装驱动程序的最新详细信息:https://pyphilly.org/django-and-sql-server-2018-edition/)
祝你好运。
【讨论】:
EXEC 命令:docs.djangoproject.com/en/2.0/topics/db/sql/… 您需要执行类似from django.db import connection 的操作,然后使用with connection.cursor() as cursor: 启动游标。祝你好运!