<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Dear List,</div><div><br></div><div>As simple as it sounds, I'm struggling with changing the datasource of layers with python :</div><div><br></div>

<div style="color:rgb(248,248,242);background-color:rgb(39,40,34);font-family:Consolas,"Courier New",monospace;font-weight:normal;font-size:14px;line-height:19px;white-space:pre"><div><span style="color:rgb(248,248,242)">layer1 </span><span style="color:rgb(249,38,114)">=</span><span style="color:rgb(248,248,242)"> QgsVectorLayer(</span><span style="color:rgb(230,219,116)">'/path/to/a.shp'</span><span style="color:rgb(248,248,242)">)</span></div><div><span style="color:rgb(248,248,242)">QgsProject.instance().addMapLayer(layer1)</span></div><div><span style="color:rgb(248,248,242)">layer1.dataProvider().setDataSourceUri(</span><span style="color:rgb(230,219,116)">'/path/to/b.shp'</span><span style="color:rgb(248,248,242)">)</span></div></div>

</div></div><div><br></div><div>The layer successfully changes on map redraw. However layer1.source() stays to the initial layer, so that the change does not persist across saves (save and reload, and you get a.shp again).</div><div><br>

</div><div>The exact same code with a geopackage doesn't work at all (no changes on map redraw).<br></div><div><br></div><div>

<div style="color:rgb(248,248,242);background-color:rgb(39,40,34);font-family:Consolas,"Courier New",monospace;font-weight:normal;font-size:14px;line-height:19px;white-space:pre"><div><span style="color:rgb(248,248,242)">layer1 </span><span style="color:rgb(249,38,114)">=</span><span style="color:rgb(248,248,242)"> QgsVectorLayer(</span><span style="color:rgb(230,219,116)">'/path/to/db.gpkg|layer=a'</span><span style="color:rgb(248,248,242)">)</span></div><div><span style="color:rgb(248,248,242)">QgsProject.instance().addMapLayer(layer1)</span></div><div><span style="color:rgb(248,248,242)">layer1.dataProvider().setDataSourceUri (</span><span style="color:rgb(230,219,116)">'/path/to/db.gpkg|layer=b'</span><span style="color:rgb(248,248,242)">) </span></div></div></div><div><div><br></div><div>
<div>There is also an entry in the pyqgis cookbook (<a href="https://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/loadlayer.html#id1">here</a>,
 scroll down) for QgsVectorLayer. The layer1.source() is correctly updated, but again, it works with shapefiles, but 
not geopackages. And this is for vectors only.<br></div><div><br></div><div><span style="color:rgb(117,113,94)">
</span><div style="color:rgb(248,248,242);background-color:rgb(39,40,34);font-family:Consolas,"Courier New",monospace;font-weight:normal;font-size:14px;line-height:19px;white-space:pre"><div><span style="color:rgb(248,248,242)">layer1.setDataSource(<span style="color:rgb(230,219,116)">'<span style="color:rgb(230,219,116)">/path/to/b.shp</span></span><span style="color:rgb(230,219,116)">'</span>, </span><span style="color:rgb(230,219,116)">"b"</span><span style="color:rgb(248,248,242)">, </span><span style="color:rgb(230,219,116)">"ogr"</span><span style="color:rgb(248,248,242)">)</span></div></div>

</div><div><br></div><div>Am I hitting a bug ? Or did I get confused somewhere ?</div><div><br></div></div><div>As I feel this is a fairly common need, I'd be very grateful if someone could help me figure out the recommended way to achieve this, for both vectors or rasters. I'll update the pyqgis cookbook in return :-)</div><div><br></div><div>Note that there are workarounds (like replacing with a new layer and copying styles over or writing directly to the .qgs file, but they are not straightforward 
and have limitations).<br></div><div><br></div><div>Thanks !!</div><div><br></div><div>Olivier</div><br><div dir="ltr"><br></div><div dir="ltr"><br></div>

</div></div></div></div>