我试图导出我的数据帧到sql数据库(Postgres)。
我创建了如下表:
CREATE TABLE dataops.OUTPUT
(
ID_TAIL CHAR(30) NOT NULL,
ID_MODEL CHAR(30) NOT NULL,
ID_FIN CHAR(30) NOT NULL,
ID_GROUP_FIN CHAR(30) NOT NULL,
ID_COMPONENT CHAR(30) NOT NULL,
DT_OPERATION TIMESTAMP NOT NULL,
DT_EXECUTION TIMESTAMP NOT NULL,
FT_VALUE_SENSOR FLOAT NOT NULL,
DT_LOAD TIMESTAMP NOT NULL
);
我想把这个数据框写到sql表中:
conn = sqlalchemy.create_engine("postgres://root:1234@localhost:5432/postgres")
data = [['ID_1', 'A4_DOOUE_ADM001', '1201MJ52', 'PATH_1', 'LATCHED1AFT',
'2016-06-22 19:10:25', '2020-11-12 17:20:33.616016', 2.9, '2020-11-12 17:54:06.340735']]
output_df=pd.DataFrame(data,columns=["id_tail", "id_model", "id_fin", "id_group_fin", "id_component", "dt_operation",
"dt_execution", "ft_value_sensor", "dt_load"])
但是,当我运行命令写入数据库output_df.to_sql
时,我意识到已经创建了一个新表"OUTPUT",其中插入了数据。
output_df.to_sql(cfg.table_names["output_rep27"], conn, cfg.db_parameters["schema"], if_exists='append',index=False)
如何避免在表中插入双引号?
短版本是双引号标识符,这是相当标准的。当大写标识符出现这种情况时,在使用它时,您必须从那时起使用双引号。使用它unquoted会将名称折叠为小写,您将找不到该表。有关这方面的详细信息,请参阅标识符语法。您有三种选择,按照我在comment中的建议执行,并强制名称小写,在使用标识符时始终使用双引号,或者修改Panda源代码以不使用双引号。
我发现了同样的问题,这里是公认的答案
我们需要在将dataframe列发送到PostgreSQL之前将其设置为小写,并为该表设置小写的表名,因此在选择表或列时不需要添加双引号
*编辑:我发现空白还迫使熊猫to_sql函数在PostgreSQL中使用双引号写入表或列名,所以如果您想使表或列名无双引号,请将空白更改为非空白字符或只需删除表名或列名中的空白
这是我自己案例中的一个例子:
import pandas as pd
import re
from sqlalchemy import create_engine
df = pd.read_excel('data.xlsx')
ws = re.compile("\s+")
# lower the case, strip leading and trailing white space,
# and substitute the whitespace between words with underscore
df.columns = [ws.sub("_", i.lower().strip()) for i in df.columns]
my_db_name = 'postgresql://postgres:my_password@localhost:5432/db_name'
engine = create_engine(my_db_name)
df.to_sql('lowercase_table_name', engine) #use lower cased table name
我没有找到一个“好”的解决方案,所以我所做的是创建我自己的函数来插入值:
import sqlalchemy
import pandas as pd
conn = sqlalchemy.create_engine("postgres://root:1234@localhost:5432/postgres")
data = [['ID_1', 'A4_DOOUE_ADM001', '1201MJ52', 'PATH_1', 'LATCHED1AFT',
'2016-06-22 19:10:25', '2020-11-12 17:20:33.616016', 2.9, '2020-11-12 17:54:06.340735']]
output_df=pd.DataFrame(data,columns=["id_tail", "id_model", "id_fin", "id_group_fin", "id_component", "dt_operation",
"dt_execution", "ft_value_sensor", "dt_load"])
def to_sql(output_df,table_name,conn,schema):
my_query = 'INSERT INTO '+schema+'.'+table_name+' ('+", ".join(list(output_df.columns))+') \
VALUES ('+ ", ".join(np.repeat('%s',output_df.shape[1]).tolist()) +');'
record_to_insert = output_df.applymap(str).values.tolist()
conn.execute(my_query,record_to_insert)
to_sql(output_df,table_name,conn,schema)
我希望它对某人有用
问题内容: 试图使用python将pandas数据框写入MySQL表。以前一直在使用,但是将来会贬值,并希望开始过渡到使用SQLAlchemy引擎。 样例代码: 读取工作正常,但存在错误: DatabaseError:在SQL’SELECT name FROM sqlite_master WHERE type =’table’AND name = ?;’上执行失败:在字符串格式化期间参数数目错误
问题内容: 我用来将数据框导出到mysql中。但是,我发现具有长字符串内容(例如url)的列被截断为63位数字。导出时,我从ipython笔记本收到以下警告: /usr/local/lib/python2.7/site- packages/pandas/io/sql.py:248:警告:第3行cur.executemany(insert_query,data)的列’url’的数据被截断了 对于不同
问题内容: 我正在尝试使用模式限定表将熊猫DataFrame写入PostgreSQL数据库。 我使用以下代码: 发生的情况是,大熊猫在名为“ a_schema.test”的表中以“公共”模式进行写入,而不是在“ a_schema”模式的“ test”表中进行写入。 如何指示熊猫使用与公共模式不同的模式? 谢谢 问题答案: 更新:从pandas 0.15开始,支持写入不同的模式。然后,您将可以使用关
问题内容: 我正在编写一个脚本,以将带有标头的大.xlsx文件减少到一个csv中,然后根据标头名称仅写有所需列的新csv文件。 我得到的错误是最后一部分代码,它说 我确定我忽略了一些愚蠢的事情,但是我已经阅读了熊猫网站上的to_csv文档,但我仍然感到茫然。我知道我使用了不正确的to_csv参数,但我似乎无法理解我猜的文档。 任何帮助表示赞赏,谢谢! 问题答案: 选择特定列的方法是这样的-
我试图导入200 SAS XPT文件到我的PostgreSQL数据库: 但是,生成的SQL对所有标识符都有双引号,例如:.问题是,如果列/表/模式是用引号创建的,每次我需要查询它们时,我必须包括引号,同时使用精确的大小写。 我想去掉引号,但我自己无法编写自定义SQL,因为这些文件的结构都非常不同。
我正试图在模式下将写入文件格式(在最新的pandas版本0.21.0中引入)。但是,文件将被新数据覆盖,而不是附加到现有文件。我错过了什么? 写入语法是 读取语法是