16

Is it possible to create a Virtual Layer through a Python script?

For example, I have a layer 'road', and I would like to perform the SQL query:

SELECT *
FROM road
WHERE type = 'Expressway'

Will this be possible? Is there any example I can refer to?

2 Answers 2

22

For QGIS 3, instead use QgsProject:

from qgis.core import QgsVectorLayer, QgsProject

sql_query = "SELECT * FROM road WHERE type = 'Expressway'"
vlayer = QgsVectorLayer(f"?query={sql_query}", "vlayer", "virtual")
QgsProject.instance().addMapLayer(vlayer)
1
  • 2
    Given current LTR QGIS version is 3.10, this answer should be the new validated one !
    – sigeal
    Jul 4, 2020 at 10:04
12

For QGIS 2 you could use something like the following:

from qgis.core import QgsVectorLayer, QgsMapLayerRegistry

sql_query = "SELECT * FROM road WHERE type = 'Expressway'"
vlayer = QgsVectorLayer(f"?query={sql_query}", "vlayer", "virtual")
QgsMapLayerRegistry.instance().addMapLayer(vlayer)

You can find examples on how to use virtual layers through Python from the author's GitHub:

https://github.com/mhugo/qgis_vlayers/blob/master/README.md

5
  • 1
    I got an error in the Python console: 'QgsMapLayerRegistry' is not defined. The SQL statement works when running in the 'Create a virtual layer' dialog. Feb 6, 2017 at 17:38
  • 1
    Did you include the 'from qgis.core import ...' line? What version are you using?
    – ndawson
    Feb 6, 2017 at 19:40
  • @eclipsed_by_the_moon - Yes, you're correct. Edited the post to include the necessary imports (thanks to annoymous user for edit).
    – Joseph
    Feb 7, 2017 at 9:56
  • 1
    @Joseph Thanks for the link provided in your answer!
    – mgri
    Feb 7, 2017 at 9:59
  • @CyT - Most welcome! Glad it worked =)
    – Joseph
    Feb 10, 2017 at 9:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.