在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。
[![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:
`` 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;""
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;""
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;""
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
类元:
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。