标签: pandas-to-sql

使用pyODBC的fast_executemany加速pandas.DataFrame.to_sql

我想发送一个大型pandas.DataFrame到运行MS SQL的远程服务器.我现在的方法是将data_frame对象转换为元组列表,然后使用pyODBC的executemany()函数将其发送出去.它是这样的:

 import pyodbc as pdb

 list_of_tuples = convert_df(data_frame)

 connection = pdb.connect(cnxn_str)

 cursor = connection.cursor()
 cursor.fast_executemany = True
 cursor.executemany(sql_statement, list_of_tuples)
 connection.commit()

 cursor.close()
 connection.close()
Run Code Online (Sandbox Code Playgroud)

然后我开始怀疑使用data_frame.to_sql()方法是否可以加速(或至少更具可读性).我想出了以下解决方案:

 import sqlalchemy as sa

 engine = sa.create_engine("mssql+pyodbc:///?odbc_connect=%s" % cnxn_str)
 data_frame.to_sql(table_name, engine, index=False)
Run Code Online (Sandbox Code Playgroud)

现在代码更具可读性,但上传速度至少慢150倍 ......

有没有办法fast_executemany在使用SQLAlchemy时翻转?

我正在使用pandas-0.20.3,pyODBC-4.0.21和sqlalchemy-1.1.13.

python sqlalchemy pyodbc pandas-to-sql

43
推荐指数
7
解决办法
3万
查看次数

如何使用 pandas.to_sql 但仅在行尚不存在时添加行

我对 python 有一些经验,但对 SQL 很陌生,并尝试使用 pandas.to_sql 将表数据添加到我的数据库中,但是当我添加时,我希望它在追加之前检查数据是否存在

这是我的 2 个数据框

>>> df0.to_markdown()
|    |   Col1 |   Col2 |
|---:|-------:|-------:|
|  0 |      0 |     00 |
|  1 |      1 |     11 |

>>> df1.to_markdown()
|    |   Col1 |   Col2 |
|---:|-------:|-------:|
|  0 |      0 |     00 |
|  1 |      1 |     11 |
|  2 |      2 |     22 |
Run Code Online (Sandbox Code Playgroud)

所以这里我使用pandas to_sql

>>> df0.to_sql(con=con, name='test_db', if_exists='append', index=False)
>>> df1.to_sql(con=con, name='test_db', if_exists='append', index=False)
Run Code Online (Sandbox Code Playgroud)

在这里我检查数据库文件中的数据

>>> df_out = …
Run Code Online (Sandbox Code Playgroud)

python mysql pandas pandas-to-sql

12
推荐指数
2
解决办法
1万
查看次数

重复键值违反唯一约束 - 尝试从 dask 数据帧创建 sql 表时出现 postgres 错误

问题之后,当我尝试从具有多个分区的 dask.dataframe 创建 postgresql 表时,出现以下错误:

IntegrityError: (psycopg2.IntegrityError) duplicate key value violates unique constraint "pg_type_typname_nsp_index"
DETAIL:  Key (typname, typnamespace)=(test1, 2200) already exists.
 [SQL: '\nCREATE TABLE test1 (\n\t"A" BIGINT, \n\t"B" BIGINT, \n\t"C" BIGINT, \n\t"D" BIGINT, \n\t"E" BIGINT, \n\t"F" BIGINT, \n\t"G" BIGINT, \n\t"H" BIGINT, \n\t"I" BIGINT, \n\t"J" BIGINT, \n\tidx BIGINT\n)\n\n']
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码重新创建错误:

import numpy as np
import dask.dataframe as dd
import dask
import pandas as pd
import sqlalchemy_utils as sqla_utils
import sqlalchemy as sqla
DATABASE_CONFIG = {
    'driver': '',
    'host': '',
    'user': …
Run Code Online (Sandbox Code Playgroud)

python postgresql pandas dask pandas-to-sql

8
推荐指数
1
解决办法
1万
查看次数

使用map_partitions和pd.df.to_sql从dask数据框创建sql表

Dask没有像pandas这样的df.to_sql(),因此我正在尝试复制该功能并使用该map_partitions方法创建sql表。这是我的代码:

import dask.dataframe as dd
import pandas as pd
import sqlalchemy_utils as sqla_utils

db_url = 'my_db_url_connection'
conn = sqla.create_engine(db_url)

ddf = dd.read_csv('data/prod.csv')
meta=dict(ddf.dtypes)
ddf.map_partitions(lambda df: df.to_sql('table_name', db_url, if_exists='append',index=True), ddf, meta=meta)
Run Code Online (Sandbox Code Playgroud)

这将返回我的dask dataframe对象,但是当我查看我的psql服务器时,没有新表...这里出了什么问题?

UPDATE 仍然无法使其正常工作,但是由于独立问题。后续问题:重复的键值违反唯一约束-尝试从dask数据帧创建sql表时出现postgres错误

python postgresql pandas dask pandas-to-sql

7
推荐指数
1
解决办法
1244
查看次数

如何从pandas.to_sql插入中获取主键

我想使用 pandas .to_sql 命令将一些数据添加到数据库中。有没有办法在我需要创建外键时获取插入对象的自动生成的主键?

到目前为止我这样做了:

楷模:

from django.db import models
class Vertices(models.Model):
    x = models.FloatField()
    y = models.FloatField()
    z = models.FloatField()
class Face(models.Model):
    Points = models.ForeignKey(Vertices, on_delete=models.PROTECT,)
Run Code Online (Sandbox Code Playgroud)

将点添加到数据库:

points.to_sql(Vertices._meta.db_table.lower(), con=engine, if_exists='append', index=False)

现在我想在 Face 表中创建一个外键来表示以下几点:

Face.objects.create(Points_id= ...)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

django-models pandas pandas-to-sql

6
推荐指数
0
解决办法
2104
查看次数

Python 使用 SQLAlchemy 连接到 AWS Aurora Serverless MySQL

有没有办法在没有 Secrets Manager ARN 的情况下指定我与 SQLAlchemy 的连接到 AWS RDS Aurora Serverless MySQL 数据库实例?我有数据库用户名、密码、端点、ARN 等,理想情况下我会初始化一个引擎,然后用于df.to_sql()将 DataFrame 加载到 Aurora 实例上的表中。

...
else:
   engine = create_engine([WHAT DO I SPECIFY HERE?])
   with engine.connect() as conn:
      df.to_sql([CODE TO APPEND TO EXISTING TABLE HERE])...
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy pandas-to-sql aws-secrets-manager aws-aurora-serverless

6
推荐指数
1
解决办法
3152
查看次数

如何忽略 Dataframe to_sql 方法中的错误

我正在使用 Pandas DataFrame.to_SQL() 将数据从数据帧插入到表中。如果单个记录存在加载问题,则不会加载任何内容,例如:如果整数列在一行中包含字符数据或日期格式在一条记录中无效等。

如何忽略这些错误?我想至少加载有效的数据,而不是在这种情况下根本不加载任何内容。

python dataframe python-3.x pandas pandas-to-sql

6
推荐指数
1
解决办法
1228
查看次数

将ignore pandas dataframe插入mysql

我想将整个pandas数据帧"插入忽略"到mysql中.有没有办法在没有循环行的情况下执行此操作?

在dataframe.to_sql中,我只看到if_exists'append'选项,但是这仍然会在重复的唯一键上继续吗?

python mysql pandas pandas-to-sql

5
推荐指数
2
解决办法
2337
查看次数

Pandas to_sql 使索引唯一

我已经阅读了有关不向数据库添加重复记录的 Pandas to_sql 解决方案。我正在处理日志的 csv 文件,每次我上传一个新的日志文件时,我都会读取数据并使用 Pandas 创建一个新的数据框进行一些更改。然后我执行to_sql('Logs',con = db.engine, if_exists = 'append', index=True). 随着if_exists arg i 确保每个时间从新文件中的新创建数据帧被附加到现有的数据库。问题是它不断添加重复值。我想确保如果一个已经上传的文件被错误地再次上传,它不会被附加到数据库中。我想在创建数据库时直接尝试执行此操作,而无需找到解决方法,例如检查之前是否使用过文件名。

我正在使用flask-sqlalchemy。

谢谢你。

unique primary-key pandas flask-sqlalchemy pandas-to-sql

5
推荐指数
1
解决办法
6765
查看次数

如何使用to_sql将pandas数据框写入oracle数据库?

我是一名新的oracle学习者。我正在尝试将pandas数据框写入到oracle表中。在网上进行研究之后,我发现代码本身非常简单,但是我不知道为什么我的代码不起作用。

我已经从本地文件中读取了熊猫数据框:

import cx_Oracle
import pandas as pd
import os

dir_path = os.path.dirname(os.path.realpath("__file__"))
df = pd.read_csv(dir_path+"/sample.csv")
Run Code Online (Sandbox Code Playgroud)

现在打印df,数据框df的数据如下:

   DATE            YEAR     MONTH      SOURCE      DESTINATION
0  11/1/2017 1:00  2017     1          AL          CO  
1  11/2/2017 1:00  2017     5          GA          ID  
2  11/3/2017 1:00  2017     12         GA          MO    
Run Code Online (Sandbox Code Playgroud)

然后,我使用cx_Oracle创建与数据库的连接,它可以工作。接下来,我尝试将数据帧df写入表TEST中。该表TEST是一个空表,已经在oracle数据库中存在,它在oracle中具有DATE,YEAR,MONTH,SOURCE,DESTINATION列。所有数据类型都与df样本数据匹配。我的代码如下:

conn_str = u'account/password@host:1521/server'
conn = cx_Oracle.connect(conn_str)

# Write records stored in a DataFrame to a oracle database
df.to_sql('TEST', conn, if_exists='replace') # the error shows here

conn.close()
Run Code Online (Sandbox Code Playgroud)

它显示错误:

DatabaseError:在sql'SELECT name from sqlite_master WHERE type ='table'AND name = …

oracle cx-oracle dataframe pandas pandas-to-sql

5
推荐指数
1
解决办法
1万
查看次数