我在Windows 7 64位上。 我有一个csv文件'data.csv'。 我想通过python脚本将数据导入postgresql表'temp_unicommerce_status'。
我的剧本是:
import psycopg2
conn = psycopg2.connect("host='localhost' port='5432' dbname='Ekodev' user='bn_openerp' password='fa05844d'")
cur = conn.cursor()
cur.execute("""truncate table "meta".temp_unicommerce_status;""")
cur.execute("""Copy temp_unicommerce_status from 'C:\Users\n\Desktop\data.csv';""")
conn.commit()
conn.close()
我收到此错误
Traceback (most recent call last):
File "C:\Users\n\Documents\NetBeansProjects\Unicommerce_Status_Update\src\unicommerce_status_update.py", line 5, in <module>
cur.execute("""Copy temp_unicommerce_status from 'C:\\Users\\n\\Desktop\\data.csv';""")
psycopg2.ProgrammingError: must be superuser to COPY to or from a file
HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
答案 0 :(得分:20)
f = open(r'C:\Users\n\Desktop\data.csv', 'r')
cur.copy_from(f, temp_unicommerce_status, sep=',')
f.close()
该文件必须作为对象传递。
由于您要处理csv文件,因此需要指定分隔符,因为默认值是制表符
答案 1 :(得分:3)
我使用psychopg2游标类函数copy_expert(文档:http://initd.org/psycopg/docs/cursor.html)解决了这个问题的方法。 copy_expert允许您使用STDIN,因此无需为postgres用户发出超级用户特权。然后,您对文件的访问取决于客户端(linux / windows / mac)用户对文件的访问
从Postgres COPY Docs(https://www.postgresql.org/docs/current/static/sql-copy.html):
请勿将COPY与psql指令\ copy混淆。 \ copy调用 从STDIN复制或复制到标准输出,然后在其中获取/存储数据 psql客户端可访问的文件。因此,文件可访问性和 \ copy时,访问权限取决于客户端而不是服务器 使用。
您还可以保留为访问development_user主文件夹和App文件夹而严格设置的权限。
csv_file_name = '/home/user/some_file.csv'
sql = "COPY table_name FROM STDIN DELIMITER '|' CSV HEADER"
cursor.copy_expert(sql, open(csv_file_name, "r"))
答案 2 :(得分:2)
#sample of code that worked for me
import psycopg2 #import the postgres library
#connect to the database
conn = psycopg2.connect(host='localhost',
dbname='database1',
user='postgres',
password='****',
port='****')
#create a cursor object
#cursor object is used to interact with the database
cur = conn.cursor()
#create table with same headers as csv file
cur.execute("CREATE TABLE IF NOT EXISTS test(**** text, **** float, **** float, ****
text)")
#open the csv file using python standard file I/O
#copy file into the table just created
with open('******.csv', 'r') as f:
next(f) # Skip the header row.
#f , <database name>, Comma-Seperated
cur.copy_from(f, '****', sep=',')
#Commit Changes
conn.commit()
#Close connection
conn.close()
f.close()
答案 3 :(得分:1)
以下是相关PostgreSQL文档的摘录:带文件名的COPY指示PostgreSQL服务器直接读取或写入文件。该文件必须可供服务器访问,并且必须从服务器的角度指定名称。指定STDIN或STDOUT时,数据通过客户端和服务器之间的连接传输
这就是copy
命令进出文件的原因限制为PostgreSQL超级用户:该文件必须存在于服务器上并由服务器进程直接加载。
您应该使用:
cur.copy_from(r'C:\Users\n\Desktop\data.csv', temp_unicommerce_status)
由this other answer建议,因为它在内部使用来自stdin的COPY
。
答案 4 :(得分:0)
您可以使用d6tstack来简化
import d6tstack
import glob
c = d6tstack.combine_csv.CombinerCSV([r'C:\Users\n\Desktop\data.csv']) # single-file
c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv')) # multi-file
c.to_psql_combine('postgresql+psycopg2://psqlusr:psqlpwdpsqlpwd@localhost/psqltest', 'tablename')
它还处理data schema changes,创建/附加/替换表,并允许您使用熊猫预处理数据。
答案 5 :(得分:0)
我知道这个问题已经回答,但这是我的两分钱。我要添加更多描述:
您可以使用cursor.copy_from
方法:
首先,您必须创建一个表,该表的列数与csv文件的列数相同。
示例:
我的csv看起来像这样:
Name, age , college , id_no , country , state , phone_no
demo_name 22 , bdsu , 1456 , demo_co , demo_da , 9894321_
首先创建一个表:
import psycopg2
from psycopg2 import Error
connection = psycopg2.connect(user = "demo_user",
password = "demo_pass",
host = "127.0.0.1",
port = "5432",
database = "postgres")
cursor = connection.cursor()
create_table_query = '''CREATE TABLE data_set
(Name TEXT NOT NULL ,
age TEXT NOT NULL ,
college TEXT NOT NULL ,
id_no TEXT NOT NULL ,
country TEXT NOT NULL ,
state TEXT NOT NULL ,
phone_no TEXT NOT NULL);'''
cursor.execute(create_table_query)
connection.commit()
现在,您只需在需要三个参数的地方使用cursor.copy_from即可:
first file object , second table_name , third sep type
您现在可以复制:
f = open(r'final_data.csv', 'r')
cursor.copy_from(f, 'data_set', sep=',')
f.close()
完成
答案 6 :(得分:0)
我将发布一些尝试将csv文件复制到基于linux的系统上的数据库时遇到的错误...。
这是一个示例csv文件:
Name Age Height
bob 23 59
tom 56 67
您必须安装库psycopg2(即pip install psycopg2或sudo apt install python3-psycopg2)
您必须先在系统上安装postgres,然后才能使用psycopg2(sudo apt install postgresql-server postgresql-contrib)
现在,您必须创建一个数据库来存储csv,除非您已经使用预先存在的数据库进行了postgres设置
使用POSTGRES命令复制CSV
在安装postgres之后,它将创建一个默认用户帐户,该帐户可让您访问postgres命令
要切换到postgres帐户问题:sudo -u postgres psql
通过发出以下提示来访问提示:psql
创建数据库mytestdb;
\ connect mytestdb;
创建表测试(名称char(50),age char(50),height char(50));
使用csv标头复制mytestdb'path / to / csv';
使用PYTHON复制CSV 将csv文件复制到数据库时遇到的主要问题是我尚未创建数据库,但是仍然可以使用python来完成。
import psycop2 #import the postgres library
#connect to the database
conn = psycopg2.connect(host='localhost',
dbname='mytestdb',
user='postgres',
password='')
#create a cursor object
#cursor object is used to interact with the database
cur = conn.cursor()
#create table with same headers as csv file
cur.execute('''create table test(name char(50), age char(50), height char(50));''')
#open the csv file using python standard file I/O
#copy file into the table just created
f = open('file.csv','r')
cursor.copy_from(f, 'test', sep=',')
f.close()
答案 7 :(得分:-1)
答案 8 :(得分:-2)
尝试与root用户一样做 - postgres。如果是linux系统,您可以更改文件的权限或将文件移动到/ tmp。该问题是由于缺少从文件系统读取的凭据而导致的。