python - 如何使用 ORM 库将 python 模块与 mysql Alchemy 集成
问题描述
我正在尝试更新 mysql 数据库表所以我首先创建 ORM 对象,帮助我通过使用 UPDATE、WHERE 条件来减少更新查询的数量
首先,我创建了一个 ORM 变量,因为这个 ORM 对象是通过使用另一个pd.data_frame
CSV 中的条件从数据框中过滤的数据这是我的简单规则,因为它很容易创建这样的条件
myOutlook_inBox = pd.read_csv (r'' + mydir + 'test.CSV', usecols=
['Subject','Body', 'From: (Name)', 'To: (Name)' ], encoding='latin-1')
这是从 ORM 中提取的简单数据pd.read_csv
replaced_sbj_value = myOutlook_inBox['Subject']
.str.extract(pat='(L(?:DEL|CAI|SIN).\d{5})').dropna()
这个 ORM 是csv.column
从myOutlook_inBox['Subject']
replaced_sbj_value = myOutlook_inBox['Subject']
.str.extract(pat='(L(?:DEL|CAI|SIN).\d{5})').dropna()
myOutlook_inBox["Subject"] = replaced_sbj_value
这是我用来过滤特定数据的条件
frm_mwfy_to_te = myOutlook_inBox.loc[myOutlook_inBox['From:
(Name)'].str.contains("mowafy", na=False)
& myOutlook_inBox['To:(Name)'].str.contains("te",
na=False)].drop_duplicates(keep=False)
frm_mwfy_to_te.Subject
并且此变量是 mysql 数据库中名为 Subject 的列中的过滤行
filtered_data = all_data
.loc[all_data.site_code.str.contains('|'.join(frm_mwfy_to_te.Subject))]
这是我的 sql 查询,我现在只需要创建一个查询,在名为“site_code”的列中更新名为“pending”过滤器的列,并更新值包含filtered_data
的行,以便用值更新或替换列pending
中的值TE
update_db_query = engine.execute("UPDATE govtracker SET pending = 'TE'
WHERE site_code = " + filtered_data)
我在想我在错误的情况下解决这个问题的任何想法
注意:我不需要在我的查询中提及旧值我只是想根据我在查询中提到的新值根据过滤后的数据框更新同一行中的值
例如,根据frm_mwfy_to_te.Subject
主题是 csv 文件中调用的列名
假设这个 ORM 的输出frm_mwfy_to_te.Subject
Subject
LCAIN20804
LDELE30434
LSINI20260
这是我的全部代码
from sqlalchemy import create_engine
import pandas as pd
import os
import csv
import MySQLdb
from sqlalchemy import types, create_engine
# MySQL Connection
MYSQL_USER = 'root'
MYSQL_PASSWORD = 'Mharooney'
MYSQL_HOST_IP = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_DATABASE = 'mydb'
engine = create_engine('mysql+mysqlconnector://'+MYSQL_USER+'
:'+MYSQL_PASSWORD+'@'+MYSQL_HOST_IP+':'+str(MYSQL_PORT)+'/'+MYSQL_DATABASE,
echo=False)
#engine = create_engine('mysql+mysqldb://root:@localhost:123456/myDB?
charset=utf8mb4&binary_prefix=true', echo=False)
mydir = (os.getcwd()).replace('\\', '/') + '/'
all_data = pd.read_sql('SELECT * FROM govtracker', engine)
# .drop(['#'], axis=1)
myOutlook_inBox = pd.read_csv(r'' + mydir + 'test.CSV', usecols=['Subject',
'Body', 'From: (Name)', 'To: (Name)'],
encoding='latin-1')
myOutlook_inBox.columns = myOutlook_inBox.columns.str.replace(' ', '')
#this object extract 5 chars and 5 numbers from specific column in csv
replaced_sbj_value = myOutlook_inBox['Subject'].str.extract(pat='(L(?:DEL|CAI|SIN).\d{5})').dropna()
#this columns I want to filter in database
myOutlook_inBox["Subject"] = replaced_sbj_value
# this conditions filters and get and dublicate repeated data from outlook
exported file
# Condition 1 any mail from mowafy to te
frm_mwfy_to_te = myOutlook_inBox.loc[myOutlook_inBox['From:
(Name)'].str.contains("mowafy", na=False)
& myOutlook_inBox['To:
(Name)'].str.contains("te", na=False)].drop_duplicates(
keep=False)
frm_mwfy_to_te.Subject
filtered_data = all_data.loc[all_data.site_code.str.contains
('|'.join(frm_mwfy_to_te.Subject))]
print(myOutlook_inBox)
all_data.replace('\n', '', regex=True)
df = all_data.where((pd.notnull(all_data)), None)
print(df)
print("Success")
print(frm_mwfy_to_te.Subject)
print(filtered_data)
# rows = engine.execute("SELECT * FROM govtracker")#.fetchall()
# print(rows)
update_db_query = engine.execute("UPDATE govtracker SET pending = 'TE'
WHERE site_code = " + filtered_data)
"""engine = create_engine('postgresql+psycopg2://user:pswd@mydb')
df.to_sql('temp_table', engine, if_exists='replace')"""
# select_db_query = pd.read_sql("SELECT * FROM govtracker", con = engine)
#print(update_db_query)
现在假设这是我的 ORM 的输出,那么我将使用这个 ORM 来过滤并从 mysql 数据库中获取这三个值的行,以更新每一行包含这些值,并且我想更新我的 sql 中调用Pending
的pending status
列
这是我的数据库查询
CREATE TABLE `mydb`.`govtracker` (
`id` INT,
`site_name` VARCHAR(255),
`region` VARCHAR(255),
`site_type` VARCHAR(255),
`site_code` VARCHAR(255),
`tac_name` VARCHAR(255),
`dt_readiness` DATE,
`rfs` VARCHAR(255),
`rfs_date` DATE,
`huawei_1st_submission_date` DATE,
`te_1st_submission_date` DATE,
`huawei_2nd_submission_date` DATE,
`te_2nd_submission_date` DATE,
`huawei_3rd_submission_date` DATE,
`te_3rd_submission_date` DATE,
`acceptance_date_opt` DATE,
`acceptance_date_plan` DATE,
`signed_sites` VARCHAR(255),
`as_built_date` DATE,
`as_built_status` VARCHAR(255),
`date_dt` DATE,
`dt_status` VARCHAR(255),
`shr_status` VARCHAR(255),
`dt_planned` INT(255),
`integeration_status` VARCHAR(255),
`comments_snags` LONGTEXT,
`cluster_name` LONGTEXT,
`type_standalone_colocated` VARCHAR(255),
`installed_type_standalone_colocated` VARCHAR(255),
`status` VARCHAR(255),
`pending` VARCHAR(255),
`pending_status` LONGTEXT,
`problematic_details` LONGTEXT,
`ets_tac` INT(255),
`region_r` VARCHAR(255),
`sf6_signed_date` DATE,
`sf6_signed_comment` LONGTEXT,
`comment_history` LONGTEXT,
`on_air_owner` VARCHAR(255),
`pp_owner` VARCHAR(255),
`report_comment` LONGTEXT,
`hu_opt_area_owner` VARCHAR(255),
`planning_owner` VARCHAR(255),
`po_number` VARCHAR(255),
`trigger_date` DATE,
`as_built_status_tr` VARCHAR(255)
) ENGINE = InnoDB;
另一个重要说明:在excel中,当我在某些列中使用过滤器时,它显示了我选择的列中的所有值可以说Pending
是我选择的具有值Accepted & PAC in progress
Planning
TE
PP
DT
FM
Rollout
Integration
Opt Team
的列所以现在所有其余列都有这样的值所以我应该有创建一个类似的columns_values
表并用我拥有的所有这些值填充这个表,因为这些值是静态值很容易解决我的情况
最后注意:这个数据库是根据现有的 xlsm 文件,但我将数据从 xlsm 推送到 mysql,现在 mysql 是我的主数据库,不是 excel 格式,但我通过 csv 文件更新 mysql 数据库,而不是在我的数据库中 orm 对象frm_mwfy_to_te.Subject
是从 csv 文件中的数据框中提取的数据
有什么想法吗?
我希望一切都足够清楚
这个材料对我有帮助吗?
https://auth0.com/blog/sqlalchemy-orm-tutorial-for-python-developers/#SQLAlchemy-ORM
它被称为 TL;DR
重要说明:过滤数据的值实际上是熊猫数据框,但仅适用于来自 CSV 文件的一列,因为我想使用我之前发布的此数据框列值进行过滤,以更新我的数据库中的某些列我刚开始更新一列称为等待一个以查看结果,然后我将通过脚本的方式更新其他列取该值并在数据库表中进行过滤,然后转到名为华为第一次提交日期的列,如果未填写,则填写当前数据,如果已填写,则转到挂起列并用 TE 替换旧值,然后转到 pending_status 并替换等待 TE 接受的旧值等等'我想创建脚本的一小部分我希望这足够清楚
解决方案
如果要将 pandas DataFrame 转换为 SQL 更新语句,最好先将其转换为元组列表,其中元组是新列值,然后使用engine.executemany
( https://stackoverflow.com/a /27743541/5015356 )
values = [tuple(x) for x in filtered_data.values]
query = """
UPDATE govtracker
SET pending = 'TE'
WHERE site_code = '%s')
"""
connection = engine.connect()
update_db_query = connection.execute(query, values)
对于每个 tuple (<sitecode>)
,这将执行更新语句。如果要更新更多列或扩展 where 子句,只需将其他列添加到,然后在您希望其他值出现的位置filtered_data
添加新的。%s
只要确保以正确的顺序保持列!
推荐阅读
- azure - 在 Azure ML Studio 上部署自定义模型
- css - 加载后未应用Django admin css
- python-3.x - 如何在列表理解中进行嵌套 for 循环?
- reactjs - 用 Formik 处理 React Native 中 DateTimePicker 的值
- c++ - 构造函数的使用如何实现数据隐藏?
- pandas - 通过 toPandas() 将 pyspark Dataframe 转换为 pandas Dataframe 后,有什么方法可以删除它
- flutter - 表单关闭时如何删除验证
- facebook-marketing-api - Facebook Marketing API 用于个人目标兴趣的转化统计
- python - 如何使用 dnn 修复此打开的 cv 库错误?
- reactjs - Reactjs:使用相同的表单进行添加和更新