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