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:
parent
6b3d292043
commit
30f8642f2e
|
@ -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):
|
||||
|
|
|
@ -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')
|
Loading…
Reference in New Issue