Skip to content

Instantly share code, notes, and snippets.

@al4
Created April 8, 2015 19:49
Show Gist options
  • Save al4/14ef99d72c1a5db5961e to your computer and use it in GitHub Desktop.
Save al4/14ef99d72c1a5db5961e to your computer and use it in GitHub Desktop.
Set the datasource on grafana dashboards
#!/usr/bin/env python
import sqlite3
import json
"""
Quick quick script to set the datasource for grafana dashboards
"""
OLD_DATASOURCE = 'null'
NEW_DATASOURCE = 'graphite'
SQLITE_DB = '/opt/grafana/data/grafana.db'
conn = None
try:
conn = sqlite3.connect(SQLITE_DB)
cur = conn.cursor()
cur.execute('SELECT id, data FROM dashboard;')
data = cur.fetchall()
except:
raise
for dash_id, dash_data in data:
dash = json.loads(dash_data)
for row in dash['rows']:
for panel in row['panels']:
try:
datasource = panel['datasource']
except KeyError:
print("Skipping dashboard: {}, row: {}, panel: {}".format(
dash['title'], row['title'], panel['title']))
if not datasource or datasource == OLD_DATASOURCE:
print("Updating dashboard: {}, row: {}, panel: {}".format(
dash['title'], row['title'], panel['title']))
panel['datasource'] = NEW_DATASOURCE
cur.execute("UPDATE dashboard SET data=? WHERE id=?", (json.dumps(dash), dash_id))
@jayme
Copy link

jayme commented Aug 21, 2019

@rojobull

I found this the same (and incompatible with python3). However, what I ended up doing:

# sqlite3 grafana.db .dump | sed -e 's/old datasource/new datasource/g' > grafana.db.new

and then dropping and importing the grafana.db.new with sqlite3

# mv grafana.db grafana.db.backup

# sqlite3 grafana.db < grafana.db.new

This works well if you had a previously unique datasource name (mine contained location i.e. "Prometheus-us-ord1")

@al4
Copy link
Author

al4 commented Aug 22, 2019

Ah, funny that you guys found this and sorry that it doesn't work! I haven't used it since it was written, and can't actually remember writing it to be honest. It wouldn't surpise me if the data structure has changed, so it probably needs updating.

@Vlggg
Copy link

Vlggg commented Oct 8, 2020

Hello folks!
I found an easy way to change data source for all dashboards. The method below tested only on sqlite database and grafana version 7.0.1.
Make a backup of grafanadb
cp grafana.db grafana.db.backup
connect to current database
sqlite3 grafana.db
execute sql query
update dashboard set data = replace(data,'"Graphite"','null');
where Graphite is the name of datasource which you want to replace and null means default datasource in grafana.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment