当MySQL是后端时,我可以这样做:
cursor.execute('show tables')
rows = cursor.fetchall()
for row in rows:
cursor.execute('drop table %s; ' % row[0])
但是当postgresql是后端时,我该如何处理呢?
当MySQL是后端时,我可以这样做:
cursor.execute('show tables')
rows = cursor.fetchall()
for row in rows:
cursor.execute('drop table %s; ' % row[0])
但是当postgresql是后端时,我该如何处理呢?
cursor.execute("""SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type != 'VIEW' AND table_name NOT LIKE 'pg_ts_%%'""")
rows = cursor.fetchall()
for row in rows:
try:
cursor.execute('drop table %s cascade ' % row[0])
print "dropping %s" % row[0]
except:
print "couldn't drop %s" % row[0]
select * from pg_tables;
获取表格列表,尽管您可能想要排除where schemaname <> 'pg_catalog'
...select * from information_schema.tables;
吗?row[2]
而不是row[0]
,并且您需要使用WHERE schemaname = 'my_django_schema_here'
子句指定要查看哪个模式。SELECT table_name from pg_tables where schemaname = 'my_django_schema_here';
和row[0]
。from pg_tables where schemaname='public'
,但是没有起作用。 - mpen我使用这个脚本来清空表格,我把它放在一个名为phoenixdb.sh
的脚本中,因为它会将数据库销毁并从灰烬中重新崛起。我使用它来防止在项目早期进行大量迁移。
set -e
python manage.py dbshell <<EOF
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
EOF
python manage.py migrate
这将从数据库中抹掉所有表而不会删除数据库。但是,您的Django用户需要拥有模式,可以通过以下设置进行设置:
alter schema public owner to django-db-user-name;
你可能也想更改数据库的所有者
alter database django-db-name owner to django-db-user-name;
./manage.py sqlclear
打印出给定应用程序名称的 DROP TABLE SQL 语句。\dt
是在Postgres中列出表的等效命令。每行都包含(schema, Name, Type, Owner)
的值,因此您必须使用第二个(row[1]
)值。
无论如何,当涉及到外键约束时,您的解决方案将会在MySQL和PostgreSQL中出现问题,如果没有任何问题,您可能会遇到序列的麻烦。所以我认为最好的方法是简单地删除整个数据库并再次调用initdb(这也是更有效的解决方案)。