Checking Django on a separate database gives "OperationalError: no such table: auth_user"

My problem is that I wanted to create a separate testing database, separate from my development database. The application itself is almost identical to the Django-Rest-Framework Quick Start Tutorial, I just use an LDAP server. My development database uses MySQL. I have a separate settings file for testing.

The full error tracing I entered here is: http://dpaste.com/1W3TX1E , but the interesting part:

sqlite3.OperationalError: no such table: auth_user 

Full test settings: http://dpaste.com/1K7KHK4 . My related settings (pyldap and django-ldap-auth are missing in installed applications, they are installed manually with pip):

  INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'njord', 'permissions', ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:', } } 

Currently, the application only performs authentication using LDAP. I think that is why I have a mistake - when I do tests, I have nothing in my database - there are no users, no groups. If the user is authenticated on the LDAP server, the user is created in the database along with all the groups in which he / she is located, so this happens on request.

What works: the development version of my application works well with external LDAP, and also works with development databases.

What does not work: Testing using the sqlite3 database in memory (I repeat, testing using the ldap development and bullying database).

The code I'm testing is here:

 from django.test import TestCase, Client import django import ldap from mockldap import MockLdap class AuthenticationTests(TestCase): """ Set Up the structure ( Accounts, Groups ) and try authentication """ # Top level hierarchy top = ('dc=ee', {'dc': ['ee']}) test = ('dc=test,dc=ee', {'dc': ['test']}) # Top level groups people = ('ou=people,dc=test,dc=ee', {'ou': ['people'], 'objectClass': ['organizationalUnit', 'top']}) groups = ('ou=groups,dc=test,dc=ee', {'ou': ['groups'], 'objectClass': ['organizationalUnit', 'top']}) # Groups admins = ('cn=admins,ou=groups,dc=test,dc=ee', {'cn': ['admins'], 'memberUid': ['admin'], 'objectClass': ['sambaGroupMapping', 'posixGroup', 'top'], 'gidNumber': ['1']}) group1 = ('cn=group1,ou=groups,dc=test,dc=ee', {'cn': ['group1'], 'memberUid': ['alice', 'bob'], 'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']}) group2 = ('cn=group2,ou=groups,dc=test,dc=ee', {'cn': ['group2'], 'memberUid': ['admin', 'bob', 'karl'], 'objectClass': ['sambaGroupMapping', 'posixGroup', 'top']}) # Users admin = ('uid=admin,ou=people,dc=test,dc=ee', {'uid': ['admin'], 'userPassword': ['ldaptest'], 'sn': ['Joe'], 'cn': ['Admin Joe'], 'mail': [' admin.joe@test.ee '], 'givenName': ['Admin'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) alice = ('uid=alice,ou=people,dc=test,dc=ee', {'uid': ['alice'], 'userPassword': ['ldaptest'], 'sn': ['Cooper'], 'cn': ['Alice Cooper'], 'mail': [' alice.cooper@test.ee '], 'givenName': ['Alice'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) bob = ('uid=bob,ou=people,dc=test,dc=ee', {'uid': ['bob'], 'userPassword': ['ldaptest'], 'sn': ['Marley'], 'cn': ['Bob Marley'], 'mail': [' bob.marley@test.ee '], 'givenName': ['Bob'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) karl = ('uid=karl,ou=people,dc=test,dc=ee', {'uid': ['karl'], 'userPassword': ['ldaptest'], 'sn': ['Suur'], 'cn': ['Karl Suur'], 'mail': [' karl.suur@test.ee '], 'givenName': ['Karl'], 'objectClass': ['top', 'person', 'posixAccount', 'shadowAccount', 'inetOrgPerson', 'sambaSamAccount']}) # This is the content of our mock LDAP directory. It takes the form # {dn: {attr: [value, ...], ...}, ...}. directory = dict([top, test, people, groups, admins, group1, group2, admin, alice, bob, karl]) @classmethod def setUpTestData(cls): # We only need to create the MockLdap instance once. The content we # pass in will be used for all LDAP connections. cls.mockldap = MockLdap(cls.directory) @classmethod def tearDownClass(cls): del cls.mockldap def setUp(self): # Patch ldap.initialize django.setup() self.mockldap.start() self.ldapobj = self.mockldap['ldap://localhost/'] def tearDown(self): # Stop patching ldap.initialize and reset state. self.mockldap.stop() del self.ldapobj def test_some_basic_mockldap_auth(self): searchStr = 'uid=alice,ou=people,dc=test,dc=ee' results = _do_simple_ldap_search(searchStr) ldapName = results[0][0] ldapPropDict = results[0][1] self.assertEqual(searchStr, ldapName) self.assertEqual(len(ldapPropDict), 7) def test_index_visible_for_all(self): c = Client() response = c.get("/") self.assertContains(response, "/users/", 1) self.assertContains(response, "/groups/", 1) def test_login(self): c = Client() response = c.post("/api-auth/login/", {'username': 'bob', 'password': 'ldaptest'}) print(response.status_code) response = c.get("/users/") print(response._container) def _do_simple_ldap_search(searchStr): conn = ldap.initialize('ldap://localhost/') conn.simple_bind_s(searchStr, 'ldaptest') results = conn.search_s(searchStr, ldap.SCOPE_SUBTREE, ) return results 

The code is also available here: http://dpaste.com/3D2H4NK (syntax highlighting).

I am not sure what the problem is. The only thing I can think of is that since there are no users in creating the database, the database is not being created, but I'm not sure. Any help is much appreciated.

I performed all the migrations.

 (venv) user@box :~/workspace/fileshare/njord$ python manage.py showmigrationsadmin [X] 0001_initial [X] 0002_logentry_remove_auto_add auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages contenttypes [X] 0001_initial [X] 0002_remove_content_type_name sessions [X] 0001_initial (venv) user@box :~/workspace/fileshare/njord$ python manage.py makemigrationsNo changes detected (venv) user@box :~/workspace/fileshare/njord$ python manage.py migrate Operations to perform: Apply all migrations: admin, sessions, auth, contenttypes Running migrations: No migrations to apply. 
+6
source share
2 answers

What you need to do is add these lines to manage.py:

 if __name__ == "__main__": if 'test' in sys.argv: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.test_settings") else: os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings") 

After adding this question, if "test" refers to the main manage.py method, the application started working correctly, after which python manage.py test and python manage.py runerver both worked with the correct settings.

However, I do not have this to work with PyCharm and test it now, how to make it work.

0
source

run
python manage.py makemigrations <appname>
for each application in INSTALLED_APPS . (Especially applications that have a ForeignKey field on auth_user )

I had another mistake to get me here, but I think the reason is the same.
django.db.utils.OperationalError: (1005, "Can't create table '<test_db>.#sql-3821_1c9' (errno: 150)")

In both cases, all tables associated with the auth module are created only during testing without executing the makemigrations .
I found a solution from here

0
source

All Articles