我想发送一个大型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 有一些经验,但对 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) 继此问题之后,当我尝试从具有多个分区的 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) 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错误
我想使用 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)
非常感谢!
有没有办法在没有 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
我正在使用 Pandas DataFrame.to_SQL() 将数据从数据帧插入到表中。如果单个记录存在加载问题,则不会加载任何内容,例如:如果整数列在一行中包含字符数据或日期格式在一条记录中无效等。
如何忽略这些错误?我想至少加载有效的数据,而不是在这种情况下根本不加载任何内容。
我想将整个pandas数据帧"插入忽略"到mysql中.有没有办法在没有循环行的情况下执行此操作?
在dataframe.to_sql中,我只看到if_exists'append'选项,但是这仍然会在重复的唯一键上继续吗?
我已经阅读了有关不向数据库添加重复记录的 Pandas to_sql 解决方案。我正在处理日志的 csv 文件,每次我上传一个新的日志文件时,我都会读取数据并使用 Pandas 创建一个新的数据框进行一些更改。然后我执行to_sql('Logs',con = db.engine, if_exists = 'append', index=True). 随着if_exists arg i 确保每个时间从新文件中的新创建数据帧被附加到现有的数据库。问题是它不断添加重复值。我想确保如果一个已经上传的文件被错误地再次上传,它不会被附加到数据库中。我想在创建数据库时直接尝试执行此操作,而无需找到解决方法,例如检查之前是否使用过文件名。
我正在使用flask-sqlalchemy。
谢谢你。
我是一名新的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 = …
pandas-to-sql ×10
pandas ×8
python ×7
dask ×2
dataframe ×2
mysql ×2
postgresql ×2
sqlalchemy ×2
cx-oracle ×1
oracle ×1
primary-key ×1
pyodbc ×1
python-3.x ×1
unique ×1