mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-28 00:17:30 -05:00
Merge pull request #32580 from jgrocha/geopackage-primary-key
Geopackage primary key available from PyQGIS
This commit is contained in:
commit
4960a5b8b0
@ -1048,6 +1048,7 @@ void QgsOgrProvider::loadFields()
|
||||
//the attribute fields need to be read again when the encoding changes
|
||||
mAttributeFields.clear();
|
||||
mDefaultValues.clear();
|
||||
mPrimaryKeyAttrs.clear();
|
||||
if ( !mOgrLayer )
|
||||
return;
|
||||
|
||||
@ -1088,6 +1089,7 @@ void QgsOgrProvider::loadFields()
|
||||
);
|
||||
mDefaultValues.insert( 0, tr( "Autogenerate" ) );
|
||||
createdFields++;
|
||||
mPrimaryKeyAttrs << 0;
|
||||
}
|
||||
|
||||
for ( int i = 0; i < fdef.GetFieldCount(); ++i )
|
||||
|
@ -131,6 +131,7 @@ class QgsOgrProvider : public QgsVectorDataProvider
|
||||
bool createSpatialIndex() override;
|
||||
bool createAttributeIndex( int field ) override;
|
||||
QgsVectorDataProvider::Capabilities capabilities() const override;
|
||||
QgsAttributeList pkAttributeIndexes() const override { return mPrimaryKeyAttrs; }
|
||||
void setEncoding( const QString &e ) override;
|
||||
bool enterUpdateMode() override { return _enterUpdateMode(); }
|
||||
bool leaveUpdateMode() override;
|
||||
@ -231,6 +232,8 @@ class QgsOgrProvider : public QgsVectorDataProvider
|
||||
mutable std::unique_ptr< OGREnvelope > mExtent;
|
||||
bool mForceRecomputeExtent = false;
|
||||
|
||||
QList<int> mPrimaryKeyAttrs;
|
||||
|
||||
/**
|
||||
* This member variable receives the same value as extent_
|
||||
in the method QgsOgrProvider::extent(). The purpose is to prevent a memory leak*/
|
||||
|
@ -737,6 +737,21 @@ class TestPyQgsOGRProviderGpkg(unittest.TestCase):
|
||||
features = [f for f in vl1.getFeatures(request)]
|
||||
self.assertEqual(len(features), 1)
|
||||
|
||||
def testPkAttributeIndexes(self):
|
||||
''' Test the primary key index '''
|
||||
tmpfile = os.path.join(self.basetestpath, 'testPkAttributeIndexes.gpkg')
|
||||
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
|
||||
ds.CreateLayer('test', geom_type=ogr.wkbPoint, options=['COLUMN_TYPES=foo=int8,bar=string', 'GEOMETRY_NAME=the_geom', 'FID=customfid'])
|
||||
ds = None
|
||||
vl = QgsVectorLayer('{}|layerid=0'.format(tmpfile), 'test', 'ogr')
|
||||
pks = vl.primaryKeyAttributes()
|
||||
fields = vl.fields()
|
||||
pkfield = fields.at(pks[0])
|
||||
self.assertEqual(len(pks), 1)
|
||||
self.assertEqual(pks[0], 0)
|
||||
self.assertEqual(pkfield.name(), 'customfid')
|
||||
self.assertTrue(pkfield.constraints().constraints() & QgsFieldConstraints.ConstraintUnique)
|
||||
|
||||
def testSublayerWithComplexLayerName(self):
|
||||
''' Test reading a gpkg with a sublayer name containing : '''
|
||||
tmpfile = os.path.join(self.basetestpath, 'testGeopackageComplexLayerName.gpkg')
|
||||
|
Loading…
x
Reference in New Issue
Block a user