在django中创建和管理postgres sql视图

django-pgviews的Python项目详细描述


#Postgres的SQL视图

[![Gitter](https://badges.gitter.im/join%20chat.svg)](https://gitter.im/mypebble/django-pgviews?utm_source=badge&utm_medium=badge&utm_campaign=pr badge&utm_content=badge)
[![Circle CI](https://circle ci.com/gh/mypebble/django pg views.png)(https://circleci.com/gh/mypebble/django pgviews)


>为django orm中的[postgresql views][pg views]添加了一流的支持:http://www.postgresql.org/docs/9.1/static/sql createview.html




##安装

install via pip:


add to installed applications in settings.py:

`` python
>installed廑apps=(


从django_pgviews导入视图为pg



class customer(models.model):
name=models.charfield(max_length=100)
post_code=models.charfield(max_length=20)
is_preferred=models.booleanfield(default=false)

class meta:
app标签='myapp'

class preferred customer(pg.view):
projection=['myapp.customer.*',]
dependencies=['myapp.otherview',]
sql="""从myapp\u customer中选择*,其中首选项=true;""

app标签='myapp'
db\u表='myapp\u pr"eferredcustomer'
managed=false
```

**注意**在"meta"中包含"managed=false"非常重要,因此django 1.7迁移不会尝试为此视图创建数据库表。


查看myapp_preferred customer as
select*from myapp_customer where is_preferred=true;
````

>若要创建所有视图,请运行``python manage.py sync_pgviews``

s将视图导入为pg


view_sql="
从myapp_customer中选择名称,post_code where is_preferred=true
"""




class preferredcustomer(pg.view):
name=models.charfield(max_length=100)
post_code=models.charfield(max_length=20)


sql=视图sql
```

必须始终在"meta"类上设置"managed=false"
。可以通过多种方式创建视图:


1。定义要映射到视图输出的字段
2。定义描述视图字段的投影

d=true
"



class preferredcustomer(pg.view):
name=models.charfield(max_length=100)
post_code=models.charfield(max_length=20)


class meta:
managed=false
db_table='my_sql撸view'
````


###define projection

`django pgviews`可以进行投影,以确定视图需要映射到哪些字段。为此,请设置"projection"属性:

``python
from django_pgviews import view as pg



class preferred customer(pg.view):
projection=['myapp.customer.*,]
sql="""select*from myapp_customer where is撸preferred=true;""

db_u table='我的SQL戋视图'
managed=false
```


这将获取"myapp.customer"上的所有字段,并将它们应用到
"preferredcustomer"

功能

新的数据。更新视图逻辑就像修改底层sql并运行:

````
python manage.py sync_pgviews--force
```


这将强制更新与新sql冲突的任何视图。


继续前进。这样可以确保预先安装其他视图。使用依赖项还可以确保在使用"sync_pgviews--force"时正确刷新视图。

**注意:**在django应用程序迁移后同步视图,将
模型添加到依赖项列表将导致同步失败。

示例:

``python
from django_pgviews将视图导入为pg


class preferred customer(pg.view):
dependencies=['myapp.otherview',]
sql="select*from myapp_customer where is_preferred=true;""

app label='myapp'
db_table='myapp_preferredcustomer'
managed=false
```

d速度更快。

但是,您确实需要手动刷新视图。要自动执行此操作,
可以附加[信号](https://docs.djangoproject.com/en/1.8/ref/signals/)
并调用刷新函数。

r其中,is_preferred=true
"


class customer(models.model):
name=models.charfield(max_length=100)
post_code=models.charfield(max_length=20)
is_preferred=models.booleanfield(default=true)


class preferredcustomer(pg.materialedview):
name=models.charfield(最大长度=100)
post_code=models.charfield(最大长度=20)



@receiver(post_save,sender=customer)
def customer_save(sender,action=none,instance=none,**kwargs):
preferredcustomer.refresh()
``````

postgres 9.4和up允许同时刷新物化视图,而不阻塞读取,只要物化视图上存在
唯一索引。若要启用并发刷新,请指定可以用作物化视图上唯一索引的列的名称。唯一索引可以在物化视图的多个列上定义。一旦启用,将'concurrent=true'传递给模型的refresh方法将导致postgres同时执行
刷新。(请注意,刷新方法本身会一直阻塞,直到刷新完成;当在另一个进程或线程中更新具体化视图时,并发刷新最有用。)


示例:

```python
从myapp_customer中选择id,name,post_code,其中is_preferred=true
"


class preferredcustomer(pg.materialedview):
concurrent_index='id,post_code'
sql=view_sql

name=models.charfield(max_length=100)
post_code=models.charfield(max_length=20)


@receiver(post_save,sender=customer)
def customer_save(sender,action=none,instance=none,**kwargs):
preferredcustomer.refresh(concurrent=true)
````

它们甚至可以生活在您自己的自定义
[postgresql schema]中(http://www.postgresql.org/docs/current/static/ddl schemas.html)。


```python
from django_pgviews import view as pg


sql=""select*from myapp_customer where is_preferred=true;"""


类元:
db_table='my_custom_schema.preferedcustomer'
managed=false
```

gs:
*`sender`-视图类
*`update`-要更新的视图是否
*`force`-是否传递了'force`
*`status`-创建视图的结果,例如'exists`,'force\u required`
*`has\u changed`-视图是否必须更改


在同步所有Postgres视图后发送。

提供参数:
*`sender`-始终`无`




<;lt;br/><;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;/td>;
<;/tr>
<;lt;lt;br/><;lt;td>;1.6<;lt;td>;
<;lt;td>;0.0.3<;lt;td>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;"td>;1.9"<;/td>;
<;td>;01.0<;lt;lt;td>;
><;lt;tr>;
<;lt;lt;lt;td>;1.10<;lt;td>;
<;lt;lt;td>;0.2.0<;lt;td>;
<;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;lt;tr>;
>


>

1.7注意






ango1.7改变了模型的加载方式,因此不再可能因为依赖模型还没有被django加载,所以sql=str(user.objects.all().query)`因为依赖模型还没有被django加载,所以sql=str(user.objects.all().query)`sql=str(user.objects.all().object)


是的设置属性`
当您尝试迁移或运行测试时,需要检查迁移中的
在模型上设置了`\u base\u manager`或`\u default\u manager`的位置,并将其替换为迁移中的"对象"。


这也适用于[django mptt](https://django-mptt.github.io/djan去mptt/upgrade.html id1)
谁已经详细介绍了这一点。


python 3支持

django pgviews在0.0.7及更高版本中支持python 3。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我可以用C++代码使用java代码吗?   java使用JSR303在派生类中提供更具体的约束   java在这个查找唯一路径数算法中我做错了什么?   java如何为2个不同的服务提供商使用2个不同的SSL证书?   java在Gridview上绘制文本   java使用连接for循环构建字符串名   java StringBuilder拆分无法处理某些文件   java事件关注EditText   Java Web Start“找不到URL的缓存资源”   java程序从命令行运行的速度比在Eclipse中慢   java为什么HttpServletRequest会截断#字符上的url输入?   java自定义折叠工具栏平滑标题大小调整   使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试   http在java客户机中使用cachecontrol头   java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字?   使用上下文作为参数/参数的java   java更有效地从Jar中提取文件   java为多个JButton提供相同的actionListener