Python 使用restapi的Cassandra模型分页
我有模特儿Python 使用restapi的Cassandra模型分页,python,api,model,cassandra,Python,Api,Model,Cassandra,我有模特儿 # File: models.py from uuid import uuid4 from cassandra.cqlengine.models import Model from cassandra.cqlengine import columns class StudentModel(Model): __table_name__ = 'students' id = columns.UUID(primary_key=True, default=uuid4)
# File: models.py
from uuid import uuid4
from cassandra.cqlengine.models import Model
from cassandra.cqlengine import columns
class StudentModel(Model):
__table_name__ = 'students'
id = columns.UUID(primary_key=True, default=uuid4)
name = columns.Text(index=True, required=True)
def __json__(self):
return {'id': str(self.id),
'name': self.name}
我编写了一个瓶子应用程序,提供这个模型的数据
# File: app.py
from bottle import run
from bottle import Bottle, request, HTTPResponse
from cassandra.cqlengine import connection
from cassandra.cqlengine.management import sync_table
from models import StudentModel
API = Bottle()
# Create Connection
connection.setup(hosts=['192.168.99.100'],
default_keyspace='test',
protocol_version=3)
# Sync database table to create table in keyspace
sync_table(StudentModel)
@API.get('/students')
def get_all_students():
all_objs = StudentModel.all()
return HTTPResponse(
body={'data': [x.__json__() for x in all_objs]},
headers={'content-type': 'application/json'},
status_code=200)
run(host='localhost',
port=8080,
app=API,
server='auto')
这段代码工作得很好,我的api也可以正常工作
curl http://localhost:8080/students -i
HTTP/1.1 200 OK
Content-Length: 74
Content-Type: application/json
Date: Tue, 23 Aug 2016 15:55:23 GMT
Server: waitress
Status-Code: 200
{"data": [{"id": "7f6d18ec-bf24-4583-a06b-b9f55a4dc6e8", "name": "test"}, {"id": "7f6d18ec-bf24-4583-a06b-b9f55a4dc6e9", "name": "test1"}]}
现在我想添加分页,并想创建具有limit
和offset
的api
我检查了一下,但没有型号的示例
然后我将api更改为:
# File: app.py
...
...
@API.get('/students')
def get_all_students():
limit = request.query.limit
offset = request.query.offset
all_objs = StudentModel.all()
if limit and offset:
all_objs = all_objs[int(offset): int(offset+limit)]
return HTTPResponse(
body={'data': [x.__json__() for x in all_objs]},
headers={'content-type': 'application/json'},
status_code=200)
...
...
并将api调用为:
curl "http://localhost:8080/students?limit=1&offset=0" -i
HTTP/1.1 200 OK
Content-Length: 74
Content-Type: application/json
Date: Tue, 23 Aug 2016 16:12:00 GMT
Server: waitress
Status-Code: 200
{"data": [{"id": "7f6d18ec-bf24-4583-a06b-b9f55a4dc6e8", "name": "test"}]}
及
我使用和得到另一个解决方案
从以上两种解决方案中,哪一种是正确的?目前,没有有效的方法使用CQLEngine进行分页。使用QuerySet切片是可行的,但请注意,以前的页面仍将在结果缓存内部具体化。因此,这可能会导致内存问题,也会影响请求性能。我已经创建了一个票证来分析一次填充一个页面的方法。您可以观看以下门票:
如果您需要即时有效的分页支持,我建议使用核心驱动程序而不是cqlengine 目前,没有有效的方法使用CQLEngine进行分页。使用QuerySet切片是可行的,但请注意,以前的页面仍将在结果缓存内部具体化。因此,这可能会导致内存问题,也会影响请求性能。我已经创建了一个票证来分析一次填充一个页面的方法。您可以观看以下门票:
如果您需要即时有效的分页支持,我建议使用核心驱动程序而不是cqlengine 谢谢Alan,你能提供核心驱动程序的链接吗?这里是一些关于分页大型查询的文档:。在下一个版本(3.7)中,您将能够恢复跨U状态的分页。请看Alan,我在我的问题中给出了相同的链接,但我正在尝试使用模型来找到实现此目的的方法。除了您当前正在使用的模型,没有其他方法可以实现此目的。谢谢Alan,我们必须更改数据重传编码。谢谢Alan,您可以给出核心驱动程序的链接吗?以下是一些有关分页大型查询的文档:。在下一个版本(3.7)中,您将能够恢复跨U状态的分页。请看Alan,我在我的问题中给出了相同的链接,但我正在尝试使用模型来找到实现这一点的方法。除了您当前正在使用的模型,没有其他方法可以实现这一点。谢谢Alan,我们必须更改数据传输编码。
curl "http://localhost:8080/students?limit=1&offset=1" -i
HTTP/1.1 200 OK
Content-Length: 75
Content-Type: application/json
Date: Tue, 23 Aug 2016 16:12:06 GMT
Server: waitress
Status-Code: 200
{"data": [{"id": "7f6d18ec-bf24-4583-a06b-b9f55a4dc6e9", "name": "test1"}]}
from bottle import run
from bottle import Bottle, request, HTTPResponse
from cassandra.cqlengine import connection
from cassandra.query import SimpleStatement
from cassandra.cqlengine.management import sync_table
from models import StudentModel
API = Bottle()
# Create Connection
connection.setup(hosts=['192.168.99.100'],
default_keyspace='test',
protocol_version=3)
# Sync database table to create table in keyspace
sync_table(StudentModel)
@API.get('/students')
def get_all_students():
limit = request.query.limit
offset = request.query.offset
page = int(request.query.page or 0)
session = connection.get_session()
session.default_fetch_size = 1
objs = StudentModel.all()
result = objs._execute(objs._select_query())
data = []
count = 0
while (not page or page > count) and result.has_more_pages:
count += 1
if page and page > count:
result.fetch_next_page()
continue
data.extend(result.current_rows)
result.fetch_next_page()
all_objs = [StudentModel(**student) for student in data]
return HTTPResponse(
body={'data': [x.__json__() for x in all_objs]},
headers={'content-type': 'application/json'},
status_code=200)
run(host='localhost',
port=8080,
app=API,
debug=True,
server='auto')