如何使用ORM库将python模块与mysql alchemy集成

时间:2019-06-11 12:14:23

标签: python mysql pandas

我正在尝试更新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')

这是从pd.read_csv提取的简单ORM数据

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)

我认为我在任何错误的情况下都可以解决此问题

注意:我不需要在查询中提及旧值,我只想根据查询中提到的新值根据过滤后的数据帧更新同一行中的值

例如 根据{{​​1}},因为Subject是在csv文件中调用的列名

让我们说说这个ORM frm_mwfy_to_te.Subject

的输出
frm_mwfy_to_te.Subject

这是我的整个代码

 Subject
 LCAIN20804
 LDELE30434
 LSINI20260

现在让我们说这是我的ORM的输出,然后我将使用该ORM来过滤并从mysql数据库中获取这三个值的行,以更新包含这些值的每一行,并且我想更新名为{{ 1}}和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) 在我的SQL中

这是我的数据库查询

Pending

另一个重要说明: 在excel中,当我在某些列中使用过滤器时,它显示了我选择的列中的所有值,可以说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; Pending {{1 }} Accepted & PAC in progress Planning TE PP DT FM 所以现在所有其余的列都有这样的值 因此,我是否必须创建一个像Rollout这样的表,并用我拥有的所有这些值填充该表,因为这些值是静态值 解决我的案子很容易

最后一个注意:该数据库是根据现有的xlsm文件创建的,但是我将数据从xlsm推送到mysql,现在mysql是我的主要数据库,不是excel格式,但是我正在通过csv文件而不是在我的数据库中更新mysql数据库。 orm对象Integration是从csv文件

中的数据帧中提取的数据

这里有什么想法吗?

我希望一切都清楚

这种材料对我有帮助吗?

https://auth0.com/blog/sqlalchemy-orm-tutorial-for-python-developers/#SQLAlchemy-ORM

它叫TL; DR

重要说明:拟合数据的值实际上是pandas Dataframe,但仅用于CSV文件中的一列,因为我想像以前发布的那样使用此dataframe列值进行过滤,以更新数据库中的某些列,而我只是从更新开始一列称为待处理列,以查看结果,之后我将通过我要创建的脚本的方式更新其他列,以使用过滤后的数据中的该值在我的数据库中进行搜索,例如,我有一个名为LCAIN20804的值我要使用此值并在数据库表中进行过滤,如果未填写,请转到名为Huawei 1st提交日期的列,如果已填写,请填写当前数据,然后转到待处理的列,并用TE替换旧值,然后转到ending_status并用等待的TE接受替换旧值,以此类推,这只是我要创建的脚本的一小部分 我希望这足够清楚

1 个答案:

答案 0 :(得分:2)

如果要将pandas DataFrame转换为SQL更新语句,最好先将其转换为元组列表,其中元组是新的列值,然后使用engine.executemany({ {3}})

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)

对于每个元组(<sitecode>),这将执行更新语句。如果要更新更多列或展开where子句,只需将其他列添加到filtered_data,然后在希望其他值出现的位置添加新的%s

请确保您按正确的顺序排列列!