我正在编写一个shell脚本(将成为一个cronjob),它将:
1:转储我的生产数据库
2:将转储导入我的开发数据库
在步骤1和2之间,我需要清除开发数据库(删除所有表?).如何从shell脚本中最好地完成?到目前为止,它看起来像这样:
#!/bin/bash
time=`date '+%Y'-'%m'-'%d'`
# 1. export(dump) the current production database
pg_dump -U production_db_name > /backup/dir/backup-${time}.sql
# missing step: drop all tables from development database so it can be re-populated
# 2. load the backup into the development database
psql -U development_db_name < backup/dir/backup-${time}.sql
Run Code Online (Sandbox Code Playgroud) 因为我想删除一些表,有人建议如下,我做了:
postgres=# drop schema public cascade;
DROP SCHEMA
postgres=# create schema public;
CREATE SCHEMA
Run Code Online (Sandbox Code Playgroud)
然后我在创建新数据库时遇到问题,例如:
postgres=# create database test;
CREATE DATABASE
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create table hi(id int primary key);
*ERROR: no schema has been selected to create in*
Run Code Online (Sandbox Code Playgroud)
你可以看到我收到了错误
错误:未选择任何架构来创建*
如何恢复公共架构?
我建议人们永远不要做"drop schema public cascade"; 如果我们不知道如何恢复.有人可以帮帮我吗?
我想让SQL在PostgreSQL中删除一个函数.我写DROP FUNCTION
了一个get函数名pg_proc
.那不是问题.但是,如果我留下空白参数,它将不会丢弃该功能.
我检查了手册,然后写了然后我必须用它的参数识别函数来放弃它,例如DROP FUNCTION some_func(text,integer)
不仅仅是DROP FUNCTION some_func
.
我在哪里可以找到参数?在表中的函数行中pg_proc
没有参数.那么如何让SQL删除该函数呢?
我试过这个..
select 'drop table if exists "' || tablename || '" cascade;'
from pg_tables
where schemaname = 'public';
Run Code Online (Sandbox Code Playgroud)
但似乎没有为一个命令工作?
运行pg_restore --clean --dbname=my_database backup_file.sql
以将数据库转储还原到空数据库时,还原成功,但出现以下警告消息:
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 161; 1259 16549 TABLE example_table root
pg_restore: [archiver (db)] could not execute query: ERROR: table "example_table" does not exist
Command was: DROP TABLE public.example_table;
WARNING: errors ignored on restore: 1
Run Code Online (Sandbox Code Playgroud)
如消息所示,恢复成功.有错误,但pg_restore
声称忽略了它们.我还能够手动查询数据库,以验证在恢复后我预期在转储中的所有数据是否都存在于数据库中.
问题是上面的命令退出状态为1,而不是0.当以编程方式执行数据库恢复时(正如我打算在自动执行此过程时那样),这是有问题的,因为我的脚本需要能够可靠地确定是否恢复成功与否.
有没有办法pg_restore
在确定退出状态时发出忽略警告?或者pg_restore
我可以使用一些替代方法,我可以从中获得更准确的成功/失败信息?如何还原数据库并可靠地以编程方式确定还原是否成功?
请注意,我目前正在使用PostgreSQL 9.1.
我正在尝试编写一些单元测试并使用它们运行它们,manage.py test
但由于django_migrations
某种原因脚本无法创建表。
这是完整的错误:
Creating test database for alias 'default'...
Traceback (most recent call last):
File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\utils.py", line 83, in _execute
return self.cursor.execute(sql)
psycopg2.ProgrammingError: no schema has been selected to create in
LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
^
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\migrations\recorder.py", line 55, in ensure_schema
editor.create_model(self.Migration)
File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\backends\base\schema.py", line 298, in …
Run Code Online (Sandbox Code Playgroud) 如何彻底擦除Postgres数据库?我正在通过Django在PaaS服务上发送查询,我想我无法访问任何命令行实用程序.我会删除整个数据库并重新创建它,但我没有权限.
我正在寻找一个简单的命令,将数据库返回到完全处女状态.
我试图将django项目移至生产环境中,因此我从使用sqlite切换到了postgres。在开发环境中,每当我更改模型或任何会显着改变数据库设置方式的更改时,我实际上只是将sqlite文件拖到垃圾箱中,然后运行syncdb来创建一个新的空文件(可能是错误的做法) 。既然我正在使用postgres,我想做同样的事情而不实际删除数据库。基本上,我想知道是否有一种方法可以完全清空或清除它,然后运行syncdb并重新开始?
我也欢迎任何其他可能导致我走上正确道路的建议,对此我是新手。
我有一个模式分配给我的用户(杰森).我无法删除架构,因为我没有权限这样做.是否有一种很好的方法可以删除每个表,数据,模式中的所有内容,并使其好像我有一个新创建的模式.基本相同的效果如下:
drop schema jason cascade;
create schema jason;
Run Code Online (Sandbox Code Playgroud)
但实际上没有删除架构.
如何删除特定架构中的所有表?只应删除架构中的表。我已经有了用下面的代码获取的所有表名,但是如何删除所有这些表?
下面是一些psycopg2代码,下面是生成的SQL
writeCon.execute("SELECT table_name FROM information_schema.tables WHERE table_schema='mySchema'")
Run Code Online (Sandbox Code Playgroud)
SELECT table_name FROM information_schema.tables WHERE table_schema='mySchema'
我有兴趣删除 Redshift 模式中的所有表。即使此解决方案有效
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
Run Code Online (Sandbox Code Playgroud)
是不是为我好,因为它降低架构权限为好。
一个解决方案,如
DO $$ DECLARE
r RECORD;
BEGIN
-- if the schema you operate on is not "current", you will want to
-- replace current_schema() in query with 'schematodeletetablesfrom'
-- *and* update the generate 'DROP...' accordingly.
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
END LOOP;
END $$;
Run Code Online (Sandbox Code Playgroud)
正如该线程中所报告的,如何删除 PostgreSQL 数据库中的所有表? 将是理想的。不幸的是,它不适用于 …
我安装了openerp并用虚拟记录对其进行了测试.现在,我需要删除所有这些虚拟记录,以便我可以重新开始真实记录.你们知道删除这些记录的方法吗?后面的数据库是postgresql
postgresql ×10
database ×4
django ×3
sql ×3
backup ×1
catalog ×1
create-table ×1
ddl ×1
drop-table ×1
function ×1
openerp ×1
sql-drop ×1