Python 如何删除多数据库中的django模型用户?
例如,我有一个带有两个应用程序(myapp、myapp2)的项目(mysite)。这些应用程序使用不同的数据库: settings.py:Python 如何删除多数据库中的django模型用户?,python,django,django-models,Python,Django,Django Models,例如,我有一个带有两个应用程序(myapp、myapp2)的项目(mysite)。这些应用程序使用不同的数据库: settings.py: 数据库={ “默认值”:{ “引擎”:“django.db.backends.postgresql”, “主机”:“127.0.0.1”, “用户”:“postgres”, “密码”:“根”, “端口”:“5432”, “名称”:“测试”, }, “测试”:{ “引擎”:“django.db.backends.mysql”, “主机”:“127.0.0.1”
数据库={
“默认值”:{
“引擎”:“django.db.backends.postgresql”,
“主机”:“127.0.0.1”,
“用户”:“postgres”,
“密码”:“根”,
“端口”:“5432”,
“名称”:“测试”,
},
“测试”:{
“引擎”:“django.db.backends.mysql”,
“主机”:“127.0.0.1”,
“用户”:“根用户”,
“密码”:“根”,
“端口”:“3306”,
“名称”:“测试”,
},
}
然后我写了一个数据库路由器:
来自django.conf导入设置的
类别批准人:
def db_用于_读取(自身、型号、**提示):
返回设置.APP\u DB\u MAPPER.get(model.\u meta.APP\u label)
def db_用于_写入(自身、型号、**提示):
返回设置.APP\u DB\u MAPPER.get(model.\u meta.APP\u label)
def allow_关系(自身、obj1、obj2、**提示):
db1=settings.APP\u DB\u MAPPER.get(obj1.\u meta.APP\u标签)
db2=settings.APP\u DB\u MAPPER.get(obj2.\u meta.APP\u label)
如果是db1和db2:
如果db1==db2:
返回真值
其他:
返回错误
一无所获
def allow_migrate(self、db、app_标签、model_name=None、**提示):
如果settings.app\u DB\u映射器中有app\u标签:
return db==settings.APP\u db\u映射器[APP\u label]
一无所获
然后应用它
settings.py:
DATABASE_router=[“mysite.app_router.AppRouter”]
APP_DB_MAPPER={“myapp”:“default”,“myapp2”:“test”}
在每个应用程序中添加一个模型:
myapp/models.py:
来自django.db导入模型的
从django.contrib.auth.models导入用户
类TestDefault(models.Model):
name=models.CharField(最大长度=100)
user=models.OneToOneField(user,on_delete=models.SET_NULL,NULL=True)
myapp2/models.py:
来自django.db导入模型的
从django.contrib.auth.models导入用户
类TestApp(models.Model):
name=models.CharField(最大长度=100)
user=models.OneToOneField(user,on_delete=models.SET_NULL,NULL=True)
迁移后,将创建以下表:
mysql(“测试”数据库):
postgres(“默认”db):
然后我尝试在shell中测试关系:
从mysite.myapp.models导入TestDefault
从mysite.myapp2.models导入TestApp
从django.contrib.auth.models导入用户
user=user.objects.create(username=“1”)#在默认数据库中
TestDefault.objects.create(name=“123”,user=user)
user=user.objects.using(“test”).create(username=“1”)#在测试数据库中
TestApp.objects.create(name=“123”,user=user)
#然后尝试删除测试数据库中的用户
user.delete()#错误!
回溯:
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute(self, sql, params, *ignored_wrapper_args)
83 else:
---> 84 return self.cursor.execute(sql, params)
85
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py in execute(self, query, args)
70 # args is None means no string interpolation
---> 71 return self.cursor.execute(query, args)
72 except Database.OperationalError as e:
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in execute(self, query, args)
208 assert isinstance(query, (bytes, bytearray))
--> 209 res = self._query(query)
210 return res
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in _query(self, q)
314 self._result = None
--> 315 db.query(q)
316 self._do_get_result(db)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/connections.py in query(self, query)
225 query = bytes(query)
--> 226 _mysql.connection.query(self, query)
227
ProgrammingError: (1146, "Table 'test.myapp_testdefault' doesn't exist")
The above exception was the direct cause of the following exception:
ProgrammingError Traceback (most recent call last)
<ipython-input-22-da112720c459> in <module>
----> 1 user.delete()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/base.py in delete(self, using, keep_parents)
916
917 collector = Collector(using=using)
--> 918 collector.collect([self], keep_parents=keep_parents)
919 return collector.delete()
920
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/deletion.py in collect(self, objs, source, nullable, collect_related, source_attr, reverse_dependency, keep_parents)
221 if self.can_fast_delete(sub_objs, from_field=field):
222 self.fast_deletes.append(sub_objs)
--> 223 elif sub_objs:
224 field.remote_field.on_delete(self, field, sub_objs, self.using)
225 for field in model._meta.private_fields:
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in __bool__(self)
276
277 def __bool__(self):
--> 278 self._fetch_all()
279 return bool(self._result_cache)
280
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in _fetch_all(self)
1240 def _fetch_all(self):
1241 if self._result_cache is None:
-> 1242 self._result_cache = list(self._iterable_class(self))
1243 if self._prefetch_related_lookups and not self._prefetch_done:
1244 self._prefetch_related_objects()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in __iter__(self)
53 # Execute the query. This will also fill compiler.select, klass_info,
54 # and annotations.
---> 55 results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
56 select, klass_info, annotation_col_map = (compiler.select, compiler.klass_info,
57 compiler.annotation_col_map)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/sql/compiler.py in execute_sql(self, result_type, chunked_fetch, chunk_size)
1098 cursor = self.connection.cursor()
1099 try:
-> 1100 cursor.execute(sql, params)
1101 except Exception:
1102 # Might fail for server-side cursors (e.g. connection closed)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in execute(self, sql, params)
97 start = time()
98 try:
---> 99 return super().execute(sql, params)
100 finally:
101 stop = time()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in execute(self, sql, params)
65
66 def execute(self, sql, params=None):
---> 67 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
68
69 def executemany(self, sql, param_list):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute_with_wrappers(self, sql, params, many, executor)
74 for wrapper in reversed(self.db.execute_wrappers):
75 executor = functools.partial(wrapper, executor)
---> 76 return executor(sql, params, many, context)
77
78 def _execute(self, sql, params, *ignored_wrapper_args):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute(self, sql, params, *ignored_wrapper_args)
82 return self.cursor.execute(sql)
83 else:
---> 84 return self.cursor.execute(sql, params)
85
86 def _executemany(self, sql, param_list, *ignored_wrapper_args):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/utils.py in __exit__(self, exc_type, exc_value, traceback)
87 if dj_exc_type not in (DataError, IntegrityError):
88 self.wrapper.errors_occurred = True
---> 89 raise dj_exc_value.with_traceback(traceback) from exc_value
90
91 def __call__(self, func):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute(self, sql, params, *ignored_wrapper_args)
82 return self.cursor.execute(sql)
83 else:
---> 84 return self.cursor.execute(sql, params)
85
86 def _executemany(self, sql, param_list, *ignored_wrapper_args):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py in execute(self, query, args)
69 try:
70 # args is None means no string interpolation
---> 71 return self.cursor.execute(query, args)
72 except Database.OperationalError as e:
73 # Map some error codes to IntegrityError, since they seem to be
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in execute(self, query, args)
207
208 assert isinstance(query, (bytes, bytearray))
--> 209 res = self._query(query)
210 return res
211
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in _query(self, q)
313 db = self._get_db()
314 self._result = None
--> 315 db.query(q)
316 self._do_get_result(db)
317 self._post_get_result()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/connections.py in query(self, query)
224 if isinstance(query, bytearray):
225 query = bytes(query)
--> 226 _mysql.connection.query(self, query)
227
228 def _bytes_literal(self, bs):
ProgrammingError: (1146, "Table 'test.myapp_testdefault' doesn't exist")
---------------------------------------------------------------------------
编程错误回溯(最近一次调用上次)
~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in_execute(self、sql、params、*忽略包装器参数)
83其他:
--->84返回self.cursor.execute(sql,params)
85
执行中的~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py(self、query、args)
70#args为None表示没有字符串插值
--->71返回self.cursor.execute(查询,参数)
72数据库除外。错误为e:
执行中的~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py(self、query、args)
208断言isinstance(查询,(字节,字节数组))
-->209 res=自我查询(查询)
210返回res
~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in_query(self,q)
314自身结果=无
-->315分贝查询(q)
316自测结果(db)
查询中的~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/MySQLdb/connections.py(self,query)
225查询=字节(查询)
-->226_mysql.connection.query(self,query)
227
编程错误:(1146,“表'test.myapp_testdefault'不存在”)
上述异常是以下异常的直接原因:
编程错误回溯(最近一次调用上次)
在里面
---->1用户。删除()
删除中的~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/django/db/models/base.py(self、using、keep_parents)
916
917收集器=收集器(使用=使用)
-->918收集器。收集([自身],保留家长=保留家长)
919返回收集器。删除()
920
收集中的~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/django/db/models/deletation.py(self、objs、source、nullable、collect\u related、source\u attr、reverse\u dependency、keep\u parents)
221如果自身可以快速删除(子对象,从字段=字段):
222 self.fast_deletes.append(sub_objs)
-->223 elif子对象:
224字段。远程字段。on_删除(self、field、sub_objs、self.using)
225用于模型中的字段。_meta.private_字段:
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in(self)
276
277 def__________(自):
-->278 self.\u fetch\u all()
279返回布尔值(自身结果缓存)
280
~/projects/learn some/learn some django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in_fetch_all(self)
1240 def_fetch_all(self):
1241如果self.\u result\u缓存为无:
->1242 self.\u result\u cache=list(self.\u iterable\u class(self))
1243如果自预取相关查找和非自预取完成:
1244自我预取
+----------+----------------------------+--------+----------+
| Schema | Name | Type | Owner |
|----------+----------------------------+--------+----------|
| public | auth_group | table | postgres |
| public | auth_group_permissions | table | postgres |
| public | auth_permission | table | postgres |
| public | auth_user | table | postgres |
| public | auth_user_groups | table | postgres |
| public | auth_user_user_permissions | table | postgres |
| public | django_admin_log | table | postgres |
| public | django_content_type | table | postgres |
| public | django_migrations | table | postgres |
| public | django_session | table | postgres |
| public | myapp_testdefault | table | postgres |
+----------+----------------------------+--------+----------+
---------------------------------------------------------------------------
ProgrammingError Traceback (most recent call last)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute(self, sql, params, *ignored_wrapper_args)
83 else:
---> 84 return self.cursor.execute(sql, params)
85
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py in execute(self, query, args)
70 # args is None means no string interpolation
---> 71 return self.cursor.execute(query, args)
72 except Database.OperationalError as e:
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in execute(self, query, args)
208 assert isinstance(query, (bytes, bytearray))
--> 209 res = self._query(query)
210 return res
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in _query(self, q)
314 self._result = None
--> 315 db.query(q)
316 self._do_get_result(db)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/connections.py in query(self, query)
225 query = bytes(query)
--> 226 _mysql.connection.query(self, query)
227
ProgrammingError: (1146, "Table 'test.myapp_testdefault' doesn't exist")
The above exception was the direct cause of the following exception:
ProgrammingError Traceback (most recent call last)
<ipython-input-22-da112720c459> in <module>
----> 1 user.delete()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/base.py in delete(self, using, keep_parents)
916
917 collector = Collector(using=using)
--> 918 collector.collect([self], keep_parents=keep_parents)
919 return collector.delete()
920
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/deletion.py in collect(self, objs, source, nullable, collect_related, source_attr, reverse_dependency, keep_parents)
221 if self.can_fast_delete(sub_objs, from_field=field):
222 self.fast_deletes.append(sub_objs)
--> 223 elif sub_objs:
224 field.remote_field.on_delete(self, field, sub_objs, self.using)
225 for field in model._meta.private_fields:
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in __bool__(self)
276
277 def __bool__(self):
--> 278 self._fetch_all()
279 return bool(self._result_cache)
280
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in _fetch_all(self)
1240 def _fetch_all(self):
1241 if self._result_cache is None:
-> 1242 self._result_cache = list(self._iterable_class(self))
1243 if self._prefetch_related_lookups and not self._prefetch_done:
1244 self._prefetch_related_objects()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/query.py in __iter__(self)
53 # Execute the query. This will also fill compiler.select, klass_info,
54 # and annotations.
---> 55 results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
56 select, klass_info, annotation_col_map = (compiler.select, compiler.klass_info,
57 compiler.annotation_col_map)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/models/sql/compiler.py in execute_sql(self, result_type, chunked_fetch, chunk_size)
1098 cursor = self.connection.cursor()
1099 try:
-> 1100 cursor.execute(sql, params)
1101 except Exception:
1102 # Might fail for server-side cursors (e.g. connection closed)
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in execute(self, sql, params)
97 start = time()
98 try:
---> 99 return super().execute(sql, params)
100 finally:
101 stop = time()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in execute(self, sql, params)
65
66 def execute(self, sql, params=None):
---> 67 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
68
69 def executemany(self, sql, param_list):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute_with_wrappers(self, sql, params, many, executor)
74 for wrapper in reversed(self.db.execute_wrappers):
75 executor = functools.partial(wrapper, executor)
---> 76 return executor(sql, params, many, context)
77
78 def _execute(self, sql, params, *ignored_wrapper_args):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute(self, sql, params, *ignored_wrapper_args)
82 return self.cursor.execute(sql)
83 else:
---> 84 return self.cursor.execute(sql, params)
85
86 def _executemany(self, sql, param_list, *ignored_wrapper_args):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/utils.py in __exit__(self, exc_type, exc_value, traceback)
87 if dj_exc_type not in (DataError, IntegrityError):
88 self.wrapper.errors_occurred = True
---> 89 raise dj_exc_value.with_traceback(traceback) from exc_value
90
91 def __call__(self, func):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/utils.py in _execute(self, sql, params, *ignored_wrapper_args)
82 return self.cursor.execute(sql)
83 else:
---> 84 return self.cursor.execute(sql, params)
85
86 def _executemany(self, sql, param_list, *ignored_wrapper_args):
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/django/db/backends/mysql/base.py in execute(self, query, args)
69 try:
70 # args is None means no string interpolation
---> 71 return self.cursor.execute(query, args)
72 except Database.OperationalError as e:
73 # Map some error codes to IntegrityError, since they seem to be
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in execute(self, query, args)
207
208 assert isinstance(query, (bytes, bytearray))
--> 209 res = self._query(query)
210 return res
211
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/cursors.py in _query(self, q)
313 db = self._get_db()
314 self._result = None
--> 315 db.query(q)
316 self._do_get_result(db)
317 self._post_get_result()
~/projects/learn-some/learn-some-django/test/.venv/lib/python3.7/site-packages/MySQLdb/connections.py in query(self, query)
224 if isinstance(query, bytearray):
225 query = bytes(query)
--> 226 _mysql.connection.query(self, query)
227
228 def _bytes_literal(self, bs):
ProgrammingError: (1146, "Table 'test.myapp_testdefault' doesn't exist")