mirror of
https://github.com/simonw/datasette.git
synced 2025-12-10 16:51:24 +01:00
Tables and custom SQL query results can now be exported as CSV. The easiest way to do this is to use the .csv extension, e.g. /test_tables/facet_cities.csv By default this is served as Content-Type: text/plain so you can see it in your browser. If you want to download the file (using text/csv and with an appropriate Content-Disposition: attachment header) you can do so like this: /test_tables/facet_cities.csv?_dl=1 We link to the CSV and downloadable CSV URLs from the table and query pages. The links use ?_size=max and so by default will return 1,000 rows. Also fixes #303 - table names ending in .json or .csv are now detected and URLs are generated that look like this instead: /test_tables/table%2Fwith%2Fslashes.csv?_format=csv The ?_format= option is available for everything else too, but we link to the .csv / .json versions in most cases because they are aesthetically pleasing.
37 lines
1.1 KiB
Python
37 lines
1.1 KiB
Python
from .fixtures import app_client # noqa
|
|
|
|
EXPECTED_TABLE_CSV = '''id,content
|
|
1,hello
|
|
2,world
|
|
3,
|
|
'''.replace('\n', '\r\n')
|
|
|
|
EXPECTED_CUSTOM_CSV = '''content
|
|
hello
|
|
world
|
|
""
|
|
'''.replace('\n', '\r\n')
|
|
|
|
|
|
def test_table_csv(app_client):
|
|
response = app_client.get('/test_tables/simple_primary_key.csv')
|
|
assert response.status == 200
|
|
assert 'text/plain; charset=utf-8' == response.headers['Content-Type']
|
|
assert EXPECTED_TABLE_CSV == response.text
|
|
|
|
|
|
def test_custom_sql_csv(app_client):
|
|
response = app_client.get(
|
|
'/test_tables.csv?sql=select+content+from+simple_primary_key'
|
|
)
|
|
assert response.status == 200
|
|
assert 'text/plain; charset=utf-8' == response.headers['Content-Type']
|
|
assert EXPECTED_CUSTOM_CSV == response.text
|
|
|
|
|
|
def test_table_csv_download(app_client):
|
|
response = app_client.get('/test_tables/simple_primary_key.csv?_dl=1')
|
|
assert response.status == 200
|
|
assert 'text/csv; charset=utf-8' == response.headers['Content-Type']
|
|
expected_disposition = 'attachment; filename="simple_primary_key.csv"'
|
|
assert expected_disposition == response.headers['Content-Disposition']
|