Merge branch 'master' into fix-table-cache
This commit is contained in:
@@ -8,7 +8,6 @@ from dataset.persistence.util import sqlite_datetime_fix
|
||||
from dataset.persistence.database import Database
|
||||
from dataset.persistence.table import Table
|
||||
from dataset.freeze.app import freeze
|
||||
from sqlalchemy import Integer, Text
|
||||
|
||||
__all__ = ['Database', 'Table', 'freeze', 'connect']
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ def freeze(result, format='csv', filename='freeze.csv',
|
||||
|
||||
result = db['person'].all()
|
||||
dataset.freeze(result, format='json', filename='all-persons.json')
|
||||
|
||||
|
||||
If ``result`` is a table (rather than a result set), all records in
|
||||
the table are exported (as if ``result.all()`` had been called).
|
||||
|
||||
@@ -59,7 +59,7 @@ def freeze(result, format='csv', filename='freeze.csv',
|
||||
|
||||
*json*
|
||||
A JSON file containing a list of dictionaries for each row
|
||||
in the table. If a ``callback`` is given, JSON with padding
|
||||
in the table. If a ``callback`` is given, JSON with padding
|
||||
(JSONP) will be generated.
|
||||
|
||||
*tabson*
|
||||
|
||||
@@ -82,8 +82,7 @@ class Export(object):
|
||||
@property
|
||||
def skip(self):
|
||||
return self.get_bool('skip')
|
||||
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
return self.get('name', self.get('query'))
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import os
|
||||
import logging
|
||||
import re
|
||||
import locale
|
||||
|
||||
@@ -69,8 +68,7 @@ class Serializer(object):
|
||||
|
||||
@property
|
||||
def wrap(self):
|
||||
return self.export.get_bool('wrap',
|
||||
default=self.mode=='list')
|
||||
return self.export.get_bool('wrap', default=self.mode == 'list')
|
||||
|
||||
def serialize(self):
|
||||
self.init()
|
||||
|
||||
@@ -21,4 +21,3 @@ class TabsonSerializer(JSONSerializer):
|
||||
if meta is not None:
|
||||
result['meta'] = meta
|
||||
return result
|
||||
|
||||
|
||||
@@ -11,9 +11,9 @@ except ImportError:
|
||||
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.pool import NullPool
|
||||
from sqlalchemy.schema import MetaData, Column, Index
|
||||
from sqlalchemy.schema import MetaData, Column
|
||||
from sqlalchemy.schema import Table as SQLATable
|
||||
from sqlalchemy import Integer, Text, String
|
||||
from sqlalchemy import Integer, String
|
||||
|
||||
from alembic.migration import MigrationContext
|
||||
from alembic.operations import Operations
|
||||
@@ -107,10 +107,8 @@ class Database(object):
|
||||
|
||||
@property
|
||||
def tables(self):
|
||||
""" Get a listing of all tables that exist in the database.
|
||||
|
||||
>>> print db.tables
|
||||
set([u'user', u'action'])
|
||||
"""
|
||||
Get a listing of all tables that exist in the database.
|
||||
"""
|
||||
return list(
|
||||
set(self.metadata.tables.keys()) | set(self._tables.keys())
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
import logging
|
||||
from itertools import count
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from ordereddict import OrderedDict # Python < 2.7 drop-in
|
||||
|
||||
from sqlalchemy.sql import and_, expression
|
||||
from sqlalchemy.schema import Column, Index
|
||||
@@ -28,9 +24,6 @@ class Table(object):
|
||||
def columns(self):
|
||||
"""
|
||||
Get a listing of all columns that exist in the table.
|
||||
|
||||
>>> print 'age' in table.columns
|
||||
True
|
||||
"""
|
||||
return set(self.table.columns.keys())
|
||||
|
||||
@@ -94,7 +87,7 @@ class Table(object):
|
||||
self._ensure_columns(row, types=types)
|
||||
self.table.insert().execute(chunk)
|
||||
self._check_dropped()
|
||||
|
||||
|
||||
chunk = []
|
||||
for i, row in enumerate(rows, start=1):
|
||||
chunk.append(row)
|
||||
@@ -104,7 +97,6 @@ class Table(object):
|
||||
|
||||
if chunk:
|
||||
_process_chunk(chunk)
|
||||
|
||||
|
||||
def update(self, row, keys, ensure=True, types={}):
|
||||
"""
|
||||
@@ -126,7 +118,7 @@ class Table(object):
|
||||
if not isinstance(keys, (list, tuple)):
|
||||
keys = [keys]
|
||||
self._check_dropped()
|
||||
if not keys or len(keys)==len(row):
|
||||
if not keys or len(keys) == len(row):
|
||||
return False
|
||||
clause = [(u, row.get(u)) for u in keys]
|
||||
|
||||
@@ -288,7 +280,7 @@ class Table(object):
|
||||
rp = self.database.executable.execute(query)
|
||||
data = rp.fetchone()
|
||||
if data is not None:
|
||||
return OrderedDict(zip(rp.keys(), data))
|
||||
return data
|
||||
|
||||
def _args_to_order_by(self, order_by):
|
||||
if order_by[0] == '-':
|
||||
@@ -337,6 +329,9 @@ class Table(object):
|
||||
rp = self.database.executable.execute(count_query)
|
||||
total_row_count = rp.fetchone()[0]
|
||||
|
||||
if _limit is None:
|
||||
_limit = total_row_count
|
||||
|
||||
if _step is None or _step is False or _step == 0:
|
||||
_step = total_row_count
|
||||
|
||||
@@ -348,9 +343,7 @@ class Table(object):
|
||||
|
||||
for i in count():
|
||||
qoffset = _offset + (_step * i)
|
||||
qlimit = _step
|
||||
if _limit is not None:
|
||||
qlimit = min(_limit - (_step * i), _step)
|
||||
qlimit = min(_limit - (_step * i), _step)
|
||||
if qlimit <= 0:
|
||||
break
|
||||
queries.append(self.table.select(whereclause=args, limit=qlimit,
|
||||
|
||||
@@ -1,9 +1,5 @@
|
||||
from datetime import datetime, timedelta
|
||||
from inspect import isgenerator
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
from ordereddict import OrderedDict # Python < 2.7 drop-in
|
||||
|
||||
from sqlalchemy import Integer, UnicodeText, Float, DateTime, Boolean, types, Table, event
|
||||
|
||||
@@ -50,7 +46,7 @@ class ResultIter(object):
|
||||
else:
|
||||
# stop here
|
||||
raise StopIteration
|
||||
return OrderedDict(zip(self.keys, row))
|
||||
return row
|
||||
|
||||
next = __next__
|
||||
|
||||
@@ -64,6 +60,8 @@ def sqlite_datetime_fix():
|
||||
epoch = datetime(1970, 1, 1, 0, 0, 0)
|
||||
|
||||
def process_bind_param(self, value, dialect):
|
||||
if isinstance(value, datetime):
|
||||
return value
|
||||
return (value / 1000 - self.epoch).total_seconds()
|
||||
|
||||
def process_result_value(self, value, dialect):
|
||||
|
||||
+2
-2
@@ -1,12 +1,12 @@
|
||||
#coding: utf-8
|
||||
import re
|
||||
from unicodedata import normalize as ucnorm, category
|
||||
|
||||
SLUG_REMOVE = re.compile(r'[,\s\.\(\)/\\;:]*')
|
||||
|
||||
|
||||
class DatasetException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class FreezeException(DatasetException):
|
||||
pass
|
||||
|
||||
|
||||
Reference in New Issue
Block a user