是否可以将原始SQL与python的django Web框架一起使用?

时间:2014-06-20 13:13:01

标签: python sql django

我正在从PHP切换到Django / Python,到目前为止我还不喜欢django的一件事是ORM。插入新行时,没关系,但是当我想选择更具体的东西时,我发现ORM比纯SQL更麻烦,特别是因为我已经很熟悉SQL了。

那么,我可以在Django中编写纯SQL,还是我被迫使用ORM?

如果可能的话,非常欢迎有关如何在django中使用SQL的示例。

2 个答案:

答案 0 :(得分:6)

是的!你可以。

https://docs.djangoproject.com/en/1.7/topics/db/sql/

来自Django的精彩文档;

有两种方式;

  1. 使用经理方法raw()

    https://docs.djangoproject.com/en/1.7/topics/db/sql/#performing-raw-queries

    class Person(models.Model):
        first_name = models.CharField(...)
        last_name = models.CharField(...)
        birth_date = models.DateField(...)
    

    然后您可以像这样执行自定义SQL:

    >>> for p in Person.objects.raw('SELECT * FROM myapp_person'):
    ...     print(p)
    John Smith
    Jane Jones
    

    使用以下方法传递参数。

    >>> lname = 'Doe'
    >>> Person.objects.raw('SELECT * FROM myapp_person WHERE last_name = %s', [lname])
    
  2. 直接执行自定义SQL。

    https://docs.djangoproject.com/en/1.7/topics/db/sql/#executing-custom-sql-directly

    from django.db import connection
    def my_custom_sql(self):
        cursor = connection.cursor()
        cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
        cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
        row = cursor.fetchone()
    return row
    

答案 1 :(得分:3)

是的,确实如此。假设您有这样的模型:

class Foo(models.Model):
    bar = models.CharField('bar', max_length=32)
你可以写

Foo.objects.raw("SELECT bar from appname__foo LIMIT 5;")

或任何你喜欢的SQL。关键是使用models.Model.objects.raw方法。

由您来确保查询返回Foo对象