Hi all,
I had originally asked a question
here:
https://stackoverflow.com/questions/52391072/creating-and-appending-to-a-list-in-sqlalchemy-database-table/52391339#52391339.
However as I am still really stuck, I thought asking to a group more
specifically focussed on SQLAlchemy would be better.
I have a table in the database (see below for test file going into
table).The table has two fields, name (the latin name e.g. homo sapiens)
and other names (the common names e.g. human, man). I want to update a
field (other names) in the table, so instead of having:
Rana rugosa human Rana rugosa man Rana rugosa frog Rana rugosa cow
In the database table, It will return this:
Rana rugosa human,man,frog,cow
The test_data file looks like this:
origin_organism common_name tested_organismRana rugosa
human -Rana rugosa man -Rana rugosa
frog homo sapiensRana rugosa cow
Rana rugosaRana rugosa frog Rana rugosaRana
rugosa frog -Rana rugosa frog
-Rana rugosa frog homo sapiens-
- -- -
homo sapiens- -
-- - --
- -- -
-
streptococcus pneumoniae - -
The code:
import sys from sqlalchemy.orm import * from sqlalchemy import * from
dbn.sqlalchemy_module import lib import pd
engine = lib.get_engine(user="user", psw="pwd", db="db",
db_host="111.111.111.11")Base = lib.get_automapped_base(engine)
session = Session(engine)
tbs = lib.get_mapped_classes(Base)
session.rollback()
df = pd.read_excel('test_data.xlsx', sheet_name = 'test2')
for index, row in df.iterrows():
origin_latin_name = row['origin_organism'].strip().lower()
other_names_name = row['common_name'].strip().lower()
tested_species = row['tested_organism'].strip().lower()
if origin_latin_name not in [None, "None", "", "-"]:
instance = [x[0] for x in
Session.query(session,tbs['species'].name).filter_by(name=origin_latin_name).all()]
if origin_latin_name not in instance:
origin_species = lib.get_or_create(
session,
tbs["species"],
name = origin_latin_name,
other_names = other_names_name
)
elif origin_latin_name in instance:
other_names_query =
Session.query(session,tbs['species'].other_names).filter_by(name=origin_latin_name)
other_names_query_list = [x for x in other_names_query]
original_list2 = list(set([y for y in x[0].split(',') for x in
other_names_query_list]))
if other_names_name not in original_list2:
original_list2.append(other_names_name)
new_list = ','.join(original_list2)
new_names = {'other_names':','.join(original_list2)}
origin_species = lib.get_or_create(
session,
tbs["species"],
name = origin_latin_name,
other_names = new_list
)
The part from the elif statement doesn't work. I've ran into two problems:
(1) The most recent error I got: NameError: name 'new_list' is not defined
(2) another error I got is that I have another table further on
map1 = lib.get_or_create(
session,
tbs["map1"],
age_id_id = age,
>
> name_id_id = origin_species.id
>
)
...and it said that origin_species object cannot be found, but I think this
is linked to the elif statement, that somehow the origin_species object is
not being updated properly.
If anyone could help I would appreciate it.
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.