import logging
import argparse
from sqlalchemy.exc import ProgrammingError
from dataset.util import FreezeException
from dataset.persistence.database import Database
from dataset.freeze.config import Configuration, Export
from dataset.freeze.format import get_serializer
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger(__name__)
parser = argparse.ArgumentParser(
description='Generate static JSON and CSV extracts from a SQL database.',
epilog='For further information, please check the documentation.')
parser.add_argument('config', metavar='CONFIG', type=str,
help='freeze file cofiguration')
def freeze(database, query, format='csv', filename='freeze.csv',
prefix='.', meta={}, indent=2, mode='list', wrap=True, **kw):
"""
Perform a data export of a given SQL statement. This is a very
flexible exporter, allowing for various output formats, metadata
assignment, and file name templating to dump each record (or a set
of records) into individual files.
"""
kw.update({
'database': database,
'query': query,
'format': format,
'filename': filename,
'prefix': prefix,
'meta': meta,
'indent': indent,
'mode': mode,
'wrap': wrap
})
return freeze_export(Export(kw))
def freeze_export(export):
try:
database = Database(export.get('database'))
query = database.query(export.get('query'))
serializer_cls = get_serializer(export)
serializer = serializer_cls(export, query)
serializer.serialize()
except ProgrammingError, pe:
raise FreezeException("Invalid query: %s" % pe)
def main():
try:
args = parser.parse_args()
config = Configuration(args.config)
for export in config.exports:
if export.skip:
log.info("Skipping: %s", export.name)
continue
log.info("Running: %s", export.name)
freeze_export(export)
except FreezeException, fe:
log.error(fe)
if __name__ == '__main__':
main()