【问题标题】:DJANGO using SQLSERVER how do I trigger the procedures?DJANGO 使用 SQLSERVER 如何触发程序?
【发布时间】:2018-05-14 23:54:31
【问题描述】:

我在大学的一个 DJANGO 项目中使用 SQLSERVER 作为数据库,我需要通过 DJANGO 触发我的触发器和程序,我一直在寻找几天来做这个,但我做不到,谁能帮助我?

【问题讨论】:

    标签: sql-server django stored-procedures triggers


    【解决方案1】:

    如果其他人最终出现在此页面上,这就是我设法做到这一点的方式......我对这个问题的解释是如何在数据库端对数据库触发器函数进行操作。我的数据库后端是 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 都将更改为新值。

    【讨论】:

      【解决方案2】:

      稍微偏离主题的建议,请见谅。

      为什么不使用 Flask。 Django 的强大功能主要在其框架内发挥作用。您使用 models.py 构建数据库。您通过框架执行迁移,并利用它通过自定义中间件或信号进行数据操作。

      如果您的数据库已经为您完成了很多繁重的工作,那么使用较少的“包含电池”框架(如 Django)并使用烧瓶或瓶子可能会更容易。如果它是针对不需要企业功能或稳定性的大学项目,则尤其如此。通过一些不太明确的框架可能更容易破解和削减。如果临近学期末,学习 Django 可能是一项艰巨的任务。

      【讨论】:

      • 我不确定我是否理解你的回答,但该项目的想法正是让我们使用这两个工具......
      • Arthur,FlipperPA 似乎在很大程度上回答了这个问题。我使用 Django 的原因是我不需要直接与数据库交互。由于 Django ORM,我根本不需要。为了完成听起来像你在做的事情,我会在 API 层(如 Django Rest Framework)或在 models.py 中的自定义保存操作中完成。使用 Django,我的代码库都在 Django 框架中。随着项目的成长和孵化,它使管理项目变得更加容易。然后,一旦我们的产品市场契合,我通常会进行重构。
      【解决方案3】:

      我只是要回答这个问题,但可以根据经验告诉您,您可能正在走一些远离最佳实践的道路。如果这将成为一个永久性项目,您可能需要进行更多挖掘;如果它是一个学习练习,那也很酷!

      回答: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/

      祝你好运。

      【讨论】:

      • 谢谢,是的,我意识到这不是最好的选择之一,但我们几乎在学期末,现在回到开始将是一个很大的延迟,链接的部分带 SQL 的 DJANGO 我只使用了 pyodbc,如何使用 ORM 来触发我的程序,我会在那儿再伸出援手,看看能不能找到一些东西,但仍然非常感谢!
      • ORM 不能真正用于触发存储过程,因为 ORM 生成 SQL 以基于 Python 类(“模型”)运行。您可以使用 Django 直接执行您的EXEC 命令:docs.djangoproject.com/en/2.0/topics/db/sql/… 您需要执行类似from django.db import connection 的操作,然后使用with connection.cursor() as cursor: 启动游标。祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2016-10-14
      • 1970-01-01
      • 2014-05-01
      相关资源
      最近更新 更多