Fixed #29350 -- Fix get_primary_key_column() method in sqlite3 backend

Thanks Tim Graham and Mariusz Felisiak for the reviews.
This commit is contained in:
Zackary Troop 2018-04-28 06:01:45 -04:00 committed by Claude Paroz
parent 6b3d292043
commit 30f8642f2e
2 changed files with 29 additions and 2 deletions

View File

@ -192,9 +192,9 @@ class DatabaseIntrospection(BaseDatabaseIntrospection):
fields_sql = create_sql[create_sql.index('(') + 1:create_sql.rindex(')')]
for field_desc in fields_sql.split(','):
field_desc = field_desc.strip()
m = re.search('"(.*)".*PRIMARY KEY( AUTOINCREMENT)?', field_desc)
m = re.match('(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*', field_desc)
if m:
return m.groups()[0]
return m.group(1) if m.group(1) else m.group(2)
return None
def _table_info(self, cursor, name):

View File

@ -0,0 +1,27 @@
import unittest
from django.db import connection
from django.test import TestCase
@unittest.skipUnless(connection.vendor == 'sqlite', 'SQLite tests')
class IntrospectionTests(TestCase):
def test_get_primary_key_column(self):
"""
Get the primary key column regardless of whether or not it has
quotation.
"""
testable_column_strings = (
('id', 'id'), ('[id]', 'id'), ('`id`', 'id'), ('"id"', 'id'),
('[id col]', 'id col'), ('`id col`', 'id col'), ('"id col"', 'id col')
)
with connection.cursor() as cursor:
for column, expected_string in testable_column_strings:
sql = 'CREATE TABLE test_primary (%s int PRIMARY KEY NOT NULL)' % column
with self.subTest(column=column):
try:
cursor.execute(sql)
field = connection.introspection.get_primary_key_column(cursor, 'test_primary')
self.assertEqual(field, expected_string)
finally:
cursor.execute('DROP TABLE test_primary')