aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMunyoki Kilyungi2022-09-02 17:28:26 +0300
committerBonfaceKilz2022-09-08 14:26:19 +0300
commit72336a5876ddffba15aede5e02546e7dbf7a19f5 (patch)
treeb2c675adab8ec76ca2c7b924820fa3b55450a48d
parentf81265ac735b837d8241d366832d4b98c2080909 (diff)
downloadgenenetwork2-72336a5876ddffba15aede5e02546e7dbf7a19f5.tar.gz
Replace g.db with database_connection() context manager
* wqflask/base/mrna_assay_tissue_data.py: Replace "flask.g" with database_connection. (MrnaAssayTissueData.__init__): Use database_connection. (MrnaAssayTissueData.get_symbol_values_pairs): Ditto. * wqflask/base/species.py: Replace "Flask.g" imports with "database_connection". (Chromosomes.chromosomes): Use database_connection. * wqflask/base/trait.py: Import database_connection. (retrieve_trait_info): Use database_connection. * wqflask/utility/authentication_tools.py: Replace "flask.g" with database_connection. (get_group_code): Use database_connection. * wqflask/utility/helper_functions.py: Replace "flask.g" with "database_connection". (get_species_groups): Use database_connection. * wqflask/wqflask/db_info.py: Replace "Flask" and "g" with "database_connection". (InfoPage.get_info): Use database_connection. * wqflask/wqflask/do_search.py (DoSearch.execute): Use database_connection(). * wqflask/wqflask/external_tools/send_to_geneweaver.py: Replace "Flask" and "g" import with database_connection. (test_chip): Use database_connection. * wqflask/wqflask/external_tools/send_to_webgestalt.py: Replace "Flask, g" imports with database_connection. (test_chip): Use database_connection. * wqflask/wqflask/gsearch.py: Replace "Flask" and "g" import with database_connection. (GSearch.__init__): Use database_connection. * wqflask/wqflask/interval_analyst/GeneUtil.py (loadGenes): Use database_connection(). * wqflask/wqflask/show_trait/SampleList.py: Replace "flask.g import" with database_connection. (SampleList.get_attributes): Use database_connection. (SampleList.get_extra_attribute_values): Ditto. * wqflask/wqflask/show_trait/show_trait.py: Replace "Flask" and "g" import with database_connection. (ShowTrait.__init__): Use database_connection. (ShowTrait.get_external_links): Ditto. (get_nearest_marker): Ditto.
-rw-r--r--wqflask/base/mrna_assay_tissue_data.py15
-rw-r--r--wqflask/base/species.py14
-rw-r--r--wqflask/base/trait.py421
-rw-r--r--wqflask/utility/authentication_tools.py13
-rw-r--r--wqflask/utility/helper_functions.py27
-rw-r--r--wqflask/wqflask/api/router.py18
-rw-r--r--wqflask/wqflask/db_info.py22
-rw-r--r--wqflask/wqflask/do_search.py7
-rw-r--r--wqflask/wqflask/external_tools/send_to_geneweaver.py79
-rw-r--r--wqflask/wqflask/external_tools/send_to_webgestalt.py82
-rw-r--r--wqflask/wqflask/gsearch.py152
-rw-r--r--wqflask/wqflask/interval_analyst/GeneUtil.py193
-rw-r--r--wqflask/wqflask/show_trait/SampleList.py53
-rw-r--r--wqflask/wqflask/show_trait/show_trait.py106
14 files changed, 627 insertions, 575 deletions
diff --git a/wqflask/base/mrna_assay_tissue_data.py b/wqflask/base/mrna_assay_tissue_data.py
index d7e747aa..b371e39f 100644
--- a/wqflask/base/mrna_assay_tissue_data.py
+++ b/wqflask/base/mrna_assay_tissue_data.py
@@ -1,6 +1,6 @@
import collections
-from flask import g
+from wqflask.database import database_connection
from utility import db_tools
from utility import Bunch
@@ -49,7 +49,11 @@ class MrnaAssayTissueData:
# lower_symbols[gene_symbol.lower()] = True
if gene_symbol != None:
lower_symbols[gene_symbol.lower()] = True
- results = list(g.db.execute(query).fetchall())
+
+ results = None
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(query)
+ results = cursor.fetchall()
for result in results:
symbol = result[0]
if symbol is not None and lower_symbols.get(symbol.lower()):
@@ -81,9 +85,10 @@ class MrnaAssayTissueData:
FROM TissueProbeSetXRef, TissueProbeSetData
WHERE TissueProbeSetData.Id IN {} and
TissueProbeSetXRef.DataId = TissueProbeSetData.Id""".format(db_tools.create_in_clause(id_list))
-
-
- results = g.db.execute(query).fetchall()
+ results = []
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(query)
+ results = cursor.fetchall()
for result in results:
if result.Symbol.lower() not in symbol_values_dict:
symbol_values_dict[result.Symbol.lower()] = [result.value]
diff --git a/wqflask/base/species.py b/wqflask/base/species.py
index f303aabb..0a13315c 100644
--- a/wqflask/base/species.py
+++ b/wqflask/base/species.py
@@ -2,7 +2,7 @@ from collections import OrderedDict
from dataclasses import dataclass
from dataclasses import InitVar
from typing import Optional, Dict
-from flask import g
+from wqflask.database import database_connection
@dataclass
@@ -46,20 +46,20 @@ class Chromosomes:
"""Lazily fetch the chromosomes"""
chromosomes = OrderedDict()
if self.species is not None:
- query = (
+ cursor.execute(
"SELECT Chr_Length.Name, Chr_Length.OrderId, Length "
"FROM Chr_Length, Species WHERE "
"Chr_Length.SpeciesId = Species.SpeciesId AND "
- "Species.Name = "
- "'%s' ORDER BY OrderId" % self.species.capitalize())
+ "Species.Name = %s "
+ "ORDER BY OrderId", (self.species.capitalize(),))
else:
- query = (
+ cursor.execute(
"SELECT Chr_Length.Name, Chr_Length.OrderId, "
"Length FROM Chr_Length, InbredSet WHERE "
"Chr_Length.SpeciesId = InbredSet.SpeciesId AND "
"InbredSet.Name = "
- "'%s' ORDER BY OrderId" % self.dataset.group.name)
- results = g.db.execute(query).fetchall()
+ "%s ORDER BY OrderId", (self.dataset.group.name,))
+ results = cursor.fetchall()
for item in results:
chromosomes[item.OrderId] = IndChromosome(
item.Name, item.Length)
diff --git a/wqflask/base/trait.py b/wqflask/base/trait.py
index b02c6033..57cc8a9b 100644
--- a/wqflask/base/trait.py
+++ b/wqflask/base/trait.py
@@ -13,8 +13,9 @@ from utility.redis_tools import get_redis_conn, get_resource_id
from utility.db_tools import escape
from flask import g, request, url_for
-
from utility.logger import getLogger
+from wqflask.database import database_connection
+
logger = getLogger(__name__)
@@ -386,226 +387,220 @@ def retrieve_trait_info(trait, dataset, get_qtl_info=False):
else:
the_url = GN_PROXY_URL + "run-action?resource={}&user={}&branch=data&action=view&trait={}".format(
resource_id, g.user_session.user_id, trait.name)
+ with database_connection() as conn, conn.cursor() as cursor:
+ try:
+ response = requests.get(the_url).content
+ trait_info = json.loads(response)
+ except: # ZS: I'm assuming the trait is viewable if the try fails for some reason; it should never reach this point unless the user has privileges, since that's dealt with in create_trait
+ trait_info = ()
+ if dataset.type == 'Publish':
+ cursor.execute(
+ "SELECT PublishXRef.Id, InbredSet.InbredSetCode, "
+ "Publication.PubMed_ID, "
+ "CAST(Phenotype.Pre_publication_description AS BINARY), "
+ "CAST(Phenotype.Post_publication_description AS BINARY), "
+ "CAST(Phenotype.Original_description AS BINARY), "
+ "CAST(Phenotype.Pre_publication_abbreviation AS BINARY), "
+ "CAST(Phenotype.Post_publication_abbreviation AS BINARY), "
+ "PublishXRef.mean, Phenotype.Lab_code, "
+ "Phenotype.Submitter, Phenotype.Owner, "
+ "Phenotype.Authorized_Users, "
+ "CAST(Publication.Authors AS BINARY), "
+ "CAST(Publication.Title AS BINARY), "
+ "CAST(Publication.Abstract AS BINARY), "
+ "CAST(Publication.Journal AS BINARY), "
+ "Publication.Volume, Publication.Pages, "
+ "Publication.Month, Publication.Year, "
+ "PublishXRef.Sequence, Phenotype.Units, "
+ "PublishXRef.comments FROM PublishXRef, Publication, "
+ "Phenotype, PublishFreeze, InbredSet WHERE "
+ "PublishXRef.Id = %s AND "
+ "Phenotype.Id = PublishXRef.PhenotypeId "
+ "AND Publication.Id = PublishXRef.PublicationId "
+ "AND PublishXRef.InbredSetId = PublishFreeze.InbredSetId "
+ "AND PublishXRef.InbredSetId = InbredSet.Id AND "
+ "PublishFreeze.Id = %s",
+ (trait.name, dataset.id,)
+ )
+ trait_info = cursor.fetchone()
+
+ # XZ, 05/08/2009: Xiaodong add this block to use ProbeSet.Id to find the probeset instead of just using ProbeSet.Name
+ # XZ, 05/08/2009: to avoid the problem of same probeset name from different platforms.
+ elif dataset.type == 'ProbeSet':
+ display_fields_string = ', ProbeSet.'.join(dataset.display_fields)
+ display_fields_string = f'ProbeSet.{display_fields_string}'
+ cursor.execute(
+ "SELECT %s FROM ProbeSet, ProbeSetFreeze, "
+ "ProbeSetXRef WHERE "
+ "ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id "
+ "AND ProbeSetXRef.ProbeSetId = ProbeSet.Id AND "
+ "ProbeSetFreeze.Name = %s AND "
+ "ProbeSet.Name = %s",
+ (display_fields_string, dataset.name,
+ str(trait.name),)
+ )
+ trait_info = cursor.fetchone()
+ # XZ, 05/08/2009: We also should use Geno.Id to find marker instead of just using Geno.Name
+ # to avoid the problem of same marker name from different species.
+ elif dataset.type == 'Geno':
+ display_fields_string = ',Geno.'.join(dataset.display_fields)
+ display_fields_string = f'Geno.{display_fields_string}'
+ cursor.execute(
+ "SELECT %s FROM Geno, GenoFreeze, "
+ "GenoXRef WHERE "
+ "GenoXRef.GenoFreezeId = GenoFreeze.Id "
+ "AND GenoXRef.GenoId = Geno.Id "
+ "AND GenoFreeze.Name = %s "
+ "AND Geno.Name = %s",
+ (display_fields_string, dataset.name, trait.name)
+ )
+ trait_info = cursor.fetchone()
+ else: # Temp type
+ cursor.execute(
+ "SELECT %s FROM %s WHERE Name = %s",
+ (','.join(dataset.display_fields),
+ dataset.type, trait.name,)
+ )
+ trait_info = cursor.fetchone()
+
+ if trait_info:
+ trait.haveinfo = True
+ for i, field in enumerate(dataset.display_fields):
+ holder = trait_info[i]
+ if isinstance(holder, bytes):
+ holder = holder.decode("utf-8", errors="ignore")
+ setattr(trait, field, holder)
- try:
- response = requests.get(the_url).content
- trait_info = json.loads(response)
- except: # ZS: I'm assuming the trait is viewable if the try fails for some reason; it should never reach this point unless the user has privileges, since that's dealt with in create_trait
- if dataset.type == 'Publish':
- query = """
- SELECT
- PublishXRef.Id, InbredSet.InbredSetCode, Publication.PubMed_ID,
- CAST(Phenotype.Pre_publication_description AS BINARY),
- CAST(Phenotype.Post_publication_description AS BINARY),
- CAST(Phenotype.Original_description AS BINARY),
- CAST(Phenotype.Pre_publication_abbreviation AS BINARY),
- CAST(Phenotype.Post_publication_abbreviation AS BINARY), PublishXRef.mean,
- Phenotype.Lab_code, Phenotype.Submitter, Phenotype.Owner, Phenotype.Authorized_Users,
- CAST(Publication.Authors AS BINARY), CAST(Publication.Title AS BINARY), CAST(Publication.Abstract AS BINARY),
- CAST(Publication.Journal AS BINARY), Publication.Volume, Publication.Pages,
- Publication.Month, Publication.Year, PublishXRef.Sequence,
- Phenotype.Units, PublishXRef.comments
- FROM
- PublishXRef, Publication, Phenotype, PublishFreeze, InbredSet
- WHERE
- PublishXRef.Id = %s AND
- Phenotype.Id = PublishXRef.PhenotypeId AND
- Publication.Id = PublishXRef.PublicationId AND
- PublishXRef.InbredSetId = PublishFreeze.InbredSetId AND
- PublishXRef.InbredSetId = InbredSet.Id AND
- PublishFreeze.Id = %s
- """ % (trait.name, dataset.id)
-
- logger.sql(query)
- trait_info = g.db.execute(query).fetchone()
-
- # XZ, 05/08/2009: Xiaodong add this block to use ProbeSet.Id to find the probeset instead of just using ProbeSet.Name
- # XZ, 05/08/2009: to avoid the problem of same probeset name from different platforms.
- elif dataset.type == 'ProbeSet':
- display_fields_string = ', ProbeSet.'.join(dataset.display_fields)
- display_fields_string = 'ProbeSet.' + display_fields_string
- query = """
- SELECT %s
- FROM ProbeSet, ProbeSetFreeze, ProbeSetXRef
- WHERE
- ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id AND
- ProbeSetXRef.ProbeSetId = ProbeSet.Id AND
- ProbeSetFreeze.Name = '%s' AND
- ProbeSet.Name = '%s'
- """ % (escape(display_fields_string),
- escape(dataset.name),
- escape(str(trait.name)))
- logger.sql(query)
- trait_info = g.db.execute(query).fetchone()
- # XZ, 05/08/2009: We also should use Geno.Id to find marker instead of just using Geno.Name
- # to avoid the problem of same marker name from different species.
- elif dataset.type == 'Geno':
- display_fields_string = ',Geno.'.join(dataset.display_fields)
- display_fields_string = 'Geno.' + display_fields_string
- query = """
- SELECT %s
- FROM Geno, GenoFreeze, GenoXRef
- WHERE
- GenoXRef.GenoFreezeId = GenoFreeze.Id AND
- GenoXRef.GenoId = Geno.Id AND
- GenoFreeze.Name = '%s' AND
- Geno.Name = '%s'
- """ % (escape(display_fields_string),
- escape(dataset.name),
- escape(trait.name))
- logger.sql(query)
- trait_info = g.db.execute(query).fetchone()
- else: # Temp type
- query = """SELECT %s FROM %s WHERE Name = %s"""
- logger.sql(query)
- trait_info = g.db.execute(query,
- ','.join(dataset.display_fields),
- dataset.type, trait.name).fetchone()
-
- if trait_info:
- trait.haveinfo = True
- for i, field in enumerate(dataset.display_fields):
- holder = trait_info[i]
- if isinstance(holder, bytes):
- holder = holder.decode("utf-8", errors="ignore")
- setattr(trait, field, holder)
-
- if dataset.type == 'Publish':
- if trait.group_code:
- trait.display_name = trait.group_code + "_" + str(trait.name)
-
- trait.confidential = 0
- if trait.pre_publication_description and not trait.pubmed_id:
- trait.confidential = 1
-
- description = trait.post_publication_description
-
- # If the dataset is confidential and the user has access to confidential
- # phenotype traits, then display the pre-publication description instead
- # of the post-publication description
- trait.description_display = "N/A"
- if not trait.pubmed_id:
- trait.abbreviation = trait.pre_publication_abbreviation
- if trait.pre_publication_description:
- trait.description_display = trait.pre_publication_description
- else:
- trait.abbreviation = trait.post_publication_abbreviation
- if description:
- trait.description_display = description.strip()
+ if dataset.type == 'Publish':
+ if trait.group_code:
+ trait.display_name = trait.group_code + "_" + str(trait.name)
+
+ trait.confidential = 0
+ if trait.pre_publication_description and not trait.pubmed_id:
+ trait.confidential = 1
+
+ description = trait.post_publication_description
+
+ # If the dataset is confidential and the user has access to confidential
+ # phenotype traits, then display the pre-publication description instead
+ # of the post-publication description
+ trait.description_display = "N/A"
+ if not trait.pubmed_id:
+ trait.abbreviation = trait.pre_publication_abbreviation
+ if trait.pre_publication_description:
+ trait.description_display = trait.pre_publication_description
+ else:
+ trait.abbreviation = trait.post_publication_abbreviation
+ if description:
+ trait.description_display = description.strip()
- if not trait.year.isdigit():
- trait.pubmed_text = "N/A"
- else:
- trait.pubmed_text = trait.year
+ if not trait.year.isdigit():
+ trait.pubmed_text = "N/A"
+ else:
+ trait.pubmed_text = trait.year
- if trait.pubmed_id:
- trait.pubmed_link = webqtlConfig.PUBMEDLINK_URL % trait.pubmed_id
+ if trait.pubmed_id:
+ trait.pubmed_link = webqtlConfig.PUBMEDLINK_URL % trait.pubmed_id
- if dataset.type == 'ProbeSet' and dataset.group:
- description_string = trait.description
- target_string = trait.probe_target_description
+ if dataset.type == 'ProbeSet' and dataset.group:
+ description_string = trait.description
+ target_string = trait.probe_target_description
- if str(description_string or "") != "" and description_string != 'None':
- description_display = description_string
- else:
- description_display = trait.symbol
-
- if (str(description_display or "") != ""
- and description_display != 'N/A'
- and str(target_string or "") != "" and target_string != 'None'):
- description_display = description_display + '; ' + target_string.strip()
-
- # Save it for the jinja2 template
- trait.description_display = description_display
-
- trait.location_repr = 'N/A'
- if trait.chr and trait.mb:
- trait.location_repr = 'Chr%s: %.6f' % (
- trait.chr, float(trait.mb))
-
- elif dataset.type == "Geno":
- trait.location_repr = 'N/A'
- if trait.chr and trait.mb:
- trait.location_repr = 'Chr%s: %.6f' % (
- trait.chr, float(trait.mb))
-
- if get_qtl_info:
- # LRS and its location
- trait.LRS_score_repr = "N/A"
- trait.LRS_location_repr = "N/A"
- trait.locus = trait.locus_chr = trait.locus_mb = trait.lrs = trait.pvalue = trait.additive = ""
- if dataset.type == 'ProbeSet' and not trait.cellid:
- trait.mean = ""
- query = """
- SELECT
- ProbeSetXRef.Locus, ProbeSetXRef.LRS, ProbeSetXRef.pValue, ProbeSetXRef.mean, ProbeSetXRef.additive
- FROM
- ProbeSetXRef, ProbeSet
- WHERE
- ProbeSetXRef.ProbeSetId = ProbeSet.Id AND
- ProbeSet.Name = "{}" AND
- ProbeSetXRef.ProbeSetFreezeId ={}
- """.format(trait.name, dataset.id)
- logger.sql(query)
- trait_qtl = g.db.execute(query).fetchone()
- if trait_qtl:
- trait.locus, trait.lrs, trait.pvalue, trait.mean, trait.additive = trait_qtl
- if trait.locus:
- query = """
- select Geno.Chr, Geno.Mb from Geno, Species
- where Species.Name = '{}' and
- Geno.Name = '{}' and
- Geno.SpeciesId = Species.Id
- """.format(dataset.group.species, trait.locus)
- logger.sql(query)
- result = g.db.execute(query).fetchone()
- if result:
- trait.locus_chr = result[0]
- trait.locus_mb = result[1]
+ if str(description_string or "") != "" and description_string != 'None':
+ description_display = description_string
+ else:
+ description_display = trait.symbol
+
+ if (str(description_display or "") != ""
+ and description_display != 'N/A'
+ and str(target_string or "") != "" and target_string != 'None'):
+ description_display = description_display + '; ' + target_string.strip()
+
+ # Save it for the jinja2 template
+ trait.description_display = description_display
+
+ trait.location_repr = 'N/A'
+ if trait.chr and trait.mb:
+ trait.location_repr = 'Chr%s: %.6f' % (
+ trait.chr, float(trait.mb))
+
+ elif dataset.type == "Geno":
+ trait.location_repr = 'N/A'
+ if trait.chr and trait.mb:
+ trait.location_repr = 'Chr%s: %.6f' % (
+ trait.chr, float(trait.mb))
+
+ if get_qtl_info:
+ # LRS and its location
+ trait.LRS_score_repr = "N/A"
+ trait.LRS_location_repr = "N/A"
+ trait.locus = trait.locus_chr = trait.locus_mb = trait.lrs = trait.pvalue = trait.additive = ""
+ if dataset.type == 'ProbeSet' and not trait.cellid:
+ trait.mean = ""
+ cursor.execute(
+ "SELECT ProbeSetXRef.Locus, ProbeSetXRef.LRS, "
+ "ProbeSetXRef.pValue, ProbeSetXRef.mean, "
+ "ProbeSetXRef.additive FROM ProbeSetXRef, "
+ "ProbeSet WHERE "
+ "ProbeSetXRef.ProbeSetId = ProbeSet.Id "
+ "AND ProbeSet.Name = %s AND "
+ "ProbeSetXRef.ProbeSetFreezeId = %s",
+ (trait.name, dataset.id,)
+ )
+ trait_qtl = cursor.fetchone()
+ if trait_qtl:
+ trait.locus, trait.lrs, trait.pvalue, trait.mean, trait.additive = trait_qtl
+ if trait.locus:
+ cursor.execute(
+ "SELECT Geno.Chr, Geno.Mb FROM "
+ "Geno, Species WHERE "
+ "Species.Name = %s AND "
+ "Geno.Name = %s AND "
+ "Geno.SpeciesId = Species.Id",
+ (dataset.group.species, trait.locus,)
+ )
+ if result := cursor.fetchone() :
+ trait.locus_chr = result[0]
+ trait.locus_mb = result[1]
+ else:
+ trait.locus = trait.locus_chr = trait.locus_mb = trait.additive = ""
else:
trait.locus = trait.locus_chr = trait.locus_mb = trait.additive = ""
- else:
- trait.locus = trait.locus_chr = trait.locus_mb = trait.additive = ""
- if dataset.type == 'Publish':
- query = """
- SELECT
- PublishXRef.Locus, PublishXRef.LRS, PublishXRef.additive
- FROM
- PublishXRef, PublishFreeze
- WHERE
- PublishXRef.Id = %s AND
- PublishXRef.InbredSetId = PublishFreeze.InbredSetId AND
- PublishFreeze.Id =%s
- """ % (trait.name, dataset.id)
- logger.sql(query)
- trait_qtl = g.db.execute(query).fetchone()
- if trait_qtl:
- trait.locus, trait.lrs, trait.additive = trait_qtl
- if trait.locus:
- query = """
- select Geno.Chr, Geno.Mb from Geno, Species
- where Species.Name = '{}' and
- Geno.Name = '{}' and
- Geno.SpeciesId = Species.Id
- """.format(dataset.group.species, trait.locus)
- logger.sql(query)
- result = g.db.execute(query).fetchone()
- if result:
- trait.locus_chr = result[0]
- trait.locus_mb = result[1]
+ if dataset.type == 'Publish':
+ cursor.execute(
+ "SELECT PublishXRef.Locus, PublishXRef.LRS, "
+ "PublishXRef.additive FROM "
+ "PublishXRef, PublishFreeze WHERE "
+ "PublishXRef.Id = %s AND "
+ "PublishXRef.InbredSetId = PublishFreeze.InbredSetId "
+ "AND PublishFreeze.Id = %s", (trait.name, dataset.id,)
+ )
+ if trait_qtl := cursor.fetchone():
+ trait.locus, trait.lrs, trait.additive = trait_qtl
+ if trait.locus:
+ cursor.execute(
+ "SELECT Geno.Chr, Geno.Mb FROM Geno, "
+ "Species WHERE Species.Name = %s "
+ "AND Geno.Name = %s AND "
+ "Geno.SpeciesId = Species.Id",
+ (dataset.group.species, trait.locus,)
+ )
+ if result := cursor.fetchone():
+ trait.locus_chr = result[0]
+ trait.locus_mb = result[1]
+ else:
+ trait.locus = trait.locus_chr = trait.locus_mb = trait.additive = ""
else:
trait.locus = trait.locus_chr = trait.locus_mb = trait.additive = ""
else:
- trait.locus = trait.locus_chr = trait.locus_mb = trait.additive = ""
- else:
- trait.locus = trait.lrs = trait.additive = ""
- if (dataset.type == 'Publish' or dataset.type == "ProbeSet") and str(trait.locus_chr or "") != "" and str(trait.locus_mb or "") != "":
- trait.LRS_location_repr = LRS_location_repr = 'Chr%s: %.6f' % (
- trait.locus_chr, float(trait.locus_mb))
- if str(trait.lrs or "") != "":
- trait.LRS_score_repr = LRS_score_repr = '%3.1f' % trait.lrs
- else:
- raise KeyError(repr(trait.name)
- + ' information is not found in the database.')
- return trait
+ trait.locus = trait.lrs = trait.additive = ""
+ if (dataset.type == 'Publish' or dataset.type == "ProbeSet") and str(trait.locus_chr or "") != "" and str(trait.locus_mb or "") != "":
+ trait.LRS_location_repr = LRS_location_repr = 'Chr%s: %.6f' % (
+ trait.locus_chr, float(trait.locus_mb))
+ if str(trait.lrs or "") != "":
+ trait.LRS_score_repr = LRS_score_repr = '%3.1f' % trait.lrs
+ else:
+ raise KeyError(repr(trait.name)
+ + ' information is not found in the database.')
+ return trait
diff --git a/wqflask/utility/authentication_tools.py b/wqflask/utility/authentication_tools.py
index 96cc0b00..a8c03fe2 100644
--- a/wqflask/utility/authentication_tools.py
+++ b/wqflask/utility/authentication_tools.py
@@ -85,12 +85,13 @@ def add_new_resource(dataset, trait_id=None):
def get_group_code(dataset):
- results = g.db.execute(
- "SELECT InbredSetCode from InbredSet where Name='{}'".format(
- dataset.group.name)).fetchone()
- if results[0]:
- return results[0]
- else:
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT InbredSetCode FROM InbredSet WHERE Name=%s",
+ (dataset.group.name,)
+ )
+ if results := cursor.fetchone():
+ return results[0]
return ""
diff --git a/wqflask/utility/helper_functions.py b/wqflask/utility/helper_functions.py
index 4229a91f..0c0794dc 100644
--- a/wqflask/utility/helper_functions.py
+++ b/wqflask/utility/helper_functions.py
@@ -4,7 +4,7 @@ from base.species import TheSpecies
from utility import hmac
-from flask import g
+from wqflask.database import database_connection
def get_species_dataset_trait(self, start_vars):
@@ -50,16 +50,19 @@ def get_trait_db_obs(self, trait_db_list):
def get_species_groups():
"""Group each species into a group"""
_menu = {}
-
- for species, group_name in g.db.execute(
+ species, group_name = None, None
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
"SELECT s.MenuName, i.InbredSetName FROM InbredSet i "
"INNER JOIN Species s ON s.SpeciesId = i.SpeciesId "
- "ORDER BY i.SpeciesId ASC, i.Name ASC").fetchall():
- if species in _menu:
- if _menu.get(species):
- _menu = _menu[species].append(group_name)
- else:
- _menu[species] = [group_name]
- return [{"species": key,
- "groups": value} for key, value in
- list(_menu.items())]
+ "ORDER BY i.SpeciesId ASC, i.Name ASC"
+ )
+ for species, group_name in cursor.fetchall():
+ if species in _menu:
+ if _menu.get(species):
+ _menu = _menu[species].append(group_name)
+ else:
+ _menu[species] = [group_name]
+ return [{"species": key,
+ "groups": value} for key, value in
+ list(_menu.items())]
diff --git a/wqflask/wqflask/api/router.py b/wqflask/wqflask/api/router.py
index 95cd2953..ca700083 100644
--- a/wqflask/wqflask/api/router.py
+++ b/wqflask/wqflask/api/router.py
@@ -999,14 +999,12 @@ def get_group_id_from_dataset(dataset_name):
def get_group_id(group_name):
- query = """
- SELECT InbredSet.Id
- FROM InbredSet
- WHERE InbredSet.Name = "{}"
- """.format(group_name)
-
- group_id = g.db.execute(query).fetchone()
- if group_id:
- return group_id[0]
- else:
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT InbredSet.Id FROM InbredSet "
+ "WHERE InbredSet.Name = %s",
+ (group_name,)
+ )
+ if group_id := cursor.fetchone():
+ return group_id[0]
return None
diff --git a/wqflask/wqflask/db_info.py b/wqflask/wqflask/db_info.py
index f5c029a6..d7ed3b9e 100644
--- a/wqflask/wqflask/db_info.py
+++ b/wqflask/wqflask/db_info.py
@@ -4,8 +4,7 @@ import urllib.error
import urllib.parse
import re
-from flask import Flask, g
-
+from wqflask.database import database_connection
class InfoPage:
def __init__(self, start_vars):
@@ -40,20 +39,21 @@ class InfoPage:
if not all([self.gn_accession_id, self.info_page_name]):
raise ValueError('No correct parameter found')
- if self.gn_accession_id:
- final_query = f"{query_base}GN_AccesionId = {self.gn_accession_id}"
- results = g.db.execute(final_query).fetchone()
- elif self.info_page_name:
- final_query = f"{query_base}InfoPageName = {self.info_page_name}"
- results = g.db.execute(final_query).fetchone()
-
+ results = None
+ with database_connection() as conn, conn.cursor() as cursor:
+ if self.gn_accession_id:
+ cursor.execute(f"{query_base}GN_AccesionId = %s",
+ (self.gn_accession_id,))
+ results = cursor.fetchone()
+ elif self.info_page_name:
+ cursor.execute(f"{query_base}InfoPageName = %s",
+ (self.info_page_name,))
+ results = cursor.fetchone()
if results:
self.info = process_query_results(results)
-
if ((not results or len(results) < 1)
and self.info_page_name and create):
return self.get_info()
-
if not self.gn_accession_id and self.info:
self.gn_accession_id = self.info['accession_id']
if not self.info_page_name and self.info:
diff --git a/wqflask/wqflask/do_search.py b/wqflask/wqflask/do_search.py
index 97143486..fad6dbcf 100644
--- a/wqflask/wqflask/do_search.py
+++ b/wqflask/wqflask/do_search.py
@@ -3,7 +3,7 @@ import re
import requests
import string
-from flask import Flask, g
+from wqflask.database import database_connection
from utility.db_tools import escape
from pprint import pformat as pf
@@ -37,8 +37,9 @@ class DoSearch:
def execute(self, query):
"""Executes query and returns results"""
query = self.normalize_spaces(query)
- results = g.db.execute(query, no_parameters=True).fetchall()
- return results
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(query)
+ return cursor.fetchall()
def handle_wildcard(self, str):
keyword = str.strip()
diff --git a/wqflask/wqflask/external_tools/send_to_geneweaver.py b/wqflask/wqflask/external_tools/send_to_geneweaver.py
index a8066b43..3a95f81d 100644
--- a/wqflask/wqflask/external_tools/send_to_geneweaver.py
+++ b/wqflask/wqflask/external_tools/send_to_geneweaver.py
@@ -20,7 +20,7 @@
import string
-from flask import Flask, g
+from wqflask.database import database_connection
from base.trait import GeneralTrait, retrieve_trait_info
from base.species import TheSpecies
@@ -68,44 +68,51 @@ def get_trait_name_list(trait_list):
def test_chip(trait_list):
final_chip_name = ""
-
- for trait_db in trait_list:
- dataset = trait_db[1]
- result = g.db.execute("""SELECT GeneChip.GO_tree_value
- FROM GeneChip, ProbeFreeze, ProbeSetFreeze
- WHERE GeneChip.Id = ProbeFreeze.ChipId and
- ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and
- ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone()
-
- if result:
- chip_name = result[0]
- if chip_name:
- if chip_name != final_chip_name:
- if final_chip_name:
- return "mixed"
+ with database_connection() as conn, conn.cursor() as cursor:
+ for trait_db in trait_list:
+ dataset = trait_db[1]
+ cursor.execute(
+ "SELECT GeneChip.GO_tree_value "
+ "FROM GeneChip, ProbeFreeze, ProbeSetFreeze "
+ "WHERE GeneChip.Id = ProbeFreeze.ChipId "
+ "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+ "AND ProbeSetFreeze.Name = %s",
+ (dataset.name,)
+ )
+
+ if result := cursor.fetchone:
+ chip_name = result[0]
+ if chip_name:
+ if chip_name != final_chip_name:
+ if final_chip_name:
+ return "mixed"
+ else:
+ final_chip_name = chip_name
else:
- final_chip_name = chip_name
+ pass
else:
- pass
+ cursor.execute(
+ "SELECT GeneChip.Name "
+ "FROM GeneChip, ProbeFreeze, ProbeSetFreeze "
+ "WHERE GeneChip.Id = ProbeFreeze.ChipId "
+ "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+ "AND ProbeSetFreeze.Name = %s",
+ (dataset.name,)
+ )
+ chip_name = f'{cursor.fetchone()[0]}_NA'
+ return chip_name
else:
- result = g.db.execute("""SELECT GeneChip.Name
- FROM GeneChip, ProbeFreeze, ProbeSetFreeze
- WHERE GeneChip.Id = ProbeFreeze.ChipId and
- ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and
- ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone()
- chip_name = '%s_NA' % result[0]
- return chip_name
- else:
- query = """SELECT GeneChip.Name
- FROM GeneChip, ProbeFreeze, ProbeSetFreeze
- WHERE GeneChip.Id = ProbeFreeze.ChipId and
- ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and
- ProbeSetFreeze.Name = '%s'""" % dataset.name
- result = g.db.execute(query).fetchone()
- if result == None:
+ cursor.execute(
+ "SELECT GeneChip.Name FROM GeneChip, "
+ "ProbeFreeze, ProbeSetFreeze WHERE "
+ "GeneChip.Id = ProbeFreeze.ChipId "
+ "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+ "AND ProbeSetFreeze.Name = %s",
+ (dataset.name,)
+ )
+ if result := cursor.fetchone():
+ chip_name = f'{result[0]}_NA'
+ return chip_name
return "not_microarray"
- else:
- chip_name = '%s_NA' % result[0]
- return chip_name
return chip_name
diff --git a/wqflask/wqflask/external_tools/send_to_webgestalt.py b/wqflask/wqflask/external_tools/send_to_webgestalt.py
index 4de684b0..0cc3fd07 100644
--- a/wqflask/wqflask/external_tools/send_to_webgestalt.py
+++ b/wqflask/wqflask/external_tools/send_to_webgestalt.py
@@ -20,7 +20,7 @@
import string
-from flask import Flask, g
+from wqflask.database import database_connection
from base.trait import GeneralTrait, retrieve_trait_info
from base.species import TheSpecies
@@ -71,46 +71,52 @@ class SendToWebGestalt:
def test_chip(trait_list):
final_chip_name = ""
-
- for trait_db in trait_list:
- dataset = trait_db[1]
- result = g.db.execute("""SELECT GeneChip.GO_tree_value
- FROM GeneChip, ProbeFreeze, ProbeSetFreeze
- WHERE GeneChip.Id = ProbeFreeze.ChipId and
- ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and
- ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone()
-
- if result:
- chip_name = result[0]
- if chip_name:
- if chip_name != final_chip_name:
- if final_chip_name:
- return "mixed"
+ with database_connection() as conn, conn.cursor() as cursor:
+ for trait_db in trait_list:
+ dataset = trait_db[1]
+ cursor.execute(
+ "SELECT GeneChip.GO_tree_value "
+ "FROM GeneChip, ProbeFreeze, "
+ "ProbeSetFreeze WHERE "
+ "GeneChip.Id = ProbeFreeze.ChipId "
+ "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+ "AND ProbeSetFreeze.Name = %s", (dataset.name,)
+ )
+
+ if result := cursor.fetchone():
+ chip_name = result[0]
+ if chip_name:
+ if chip_name != final_chip_name:
+ if final_chip_name:
+ return "mixed"
+ else:
+ final_chip_name = chip_name
else:
- final_chip_name = chip_name
+ pass
else:
- pass
- else:
- result = g.db.execute("""SELECT GeneChip.Name
- FROM GeneChip, ProbeFreeze, ProbeSetFreeze
- WHERE GeneChip.Id = ProbeFreeze.ChipId and
- ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and
- ProbeSetFreeze.Name = '%s'""" % dataset.name).fetchone()
- chip_name = '%s_NA' % result[0]
- return chip_name
- else:
- query = """SELECT GeneChip.Name
- FROM GeneChip, ProbeFreeze, ProbeSetFreeze
- WHERE GeneChip.Id = ProbeFreeze.ChipId and
- ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id and
- ProbeSetFreeze.Name = '%s'""" % dataset.name
- result = g.db.execute(query).fetchone()
- if result == None:
- return "not_microarray"
+ cursor.execute(
+ "SELECT GeneChip.Name FROM GeneChip, ProbeFreeze, "
+ "ProbeSetFreeze WHERE "
+ "GeneChip.Id = ProbeFreeze.ChipId AND "
+ "ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id "
+ "AND ProbeSetFreeze.Name = %s", (dataset.name,)
+ )
+ result = cursor.fetchone()
+ chip_name = f'{result[0]}_NA'
+ return chip_name
else:
- chip_name = '%s_NA' % result[0]
- return chip_name
-
+ cursor.execute(
+ "SELECT GeneChip.Name FROM GeneChip, ProbeFreeze, "
+ "ProbeSetFreeze WHERE GeneChip.Id = ProbeFreeze.ChipId "
+ "AND ProbeSetFreeze.ProbeFreezeId = ProbeFreeze.Id AND "
+ "ProbeSetFreeze.Name = %s", (dataset.name,)
+ )
+ result = cursor.fetchone()
+ if not result:
+ return "not_microarray"
+ else:
+ chip_name = f'{result[0]}_NA'
+ return chip_name
return chip_name
diff --git a/wqflask/wqflask/gsearch.py b/wqflask/wqflask/gsearch.py
index 56877524..cd3724d9 100644
--- a/wqflask/wqflask/gsearch.py
+++ b/wqflask/wqflask/gsearch.py
@@ -2,7 +2,7 @@ import json
import datetime as dt
from types import SimpleNamespace
-from flask import Flask, g
+from wqflask.database import database_connection
from base.data_set import create_dataset
from base.trait import create_trait
from db import webqtlDatabaseFunction
@@ -26,45 +26,52 @@ class GSearch:
assert(is_str(self.type))
if self.type == "gene":
- sql = """
- SELECT
- Species.`Name` AS species_name,
- InbredSet.`Name` AS inbredset_name,
- Tissue.`Name` AS tissue_name,
- ProbeSetFreeze.Name AS probesetfreeze_name,
- ProbeSetFreeze.FullName AS probesetfreeze_fullname,
- ProbeSet.Name AS probeset_name,
- ProbeSet.Symbol AS probeset_symbol,
- CAST(ProbeSet.`description` AS BINARY) AS probeset_description,
- ProbeSet.Chr AS chr,
- ProbeSet.Mb AS mb,
- ProbeSetXRef.Mean AS mean,
- ProbeSetXRef.LRS AS lrs,
- ProbeSetXRef.`Locus` AS locus,
- ProbeSetXRef.`pValue` AS pvalue,
- ProbeSetXRef.`additive` AS additive,
- ProbeSetFreeze.Id AS probesetfreeze_id,
- Geno.Chr as geno_chr,
- Geno.Mb as geno_mb
- FROM Species
- INNER JOIN InbredSet ON InbredSet.`SpeciesId`=Species.`Id`
- INNER JOIN ProbeFreeze ON ProbeFreeze.InbredSetId=InbredSet.`Id`
- INNER JOIN Tissue ON ProbeFreeze.`TissueId`=Tissue.`Id`
- INNER JOIN ProbeSetFreeze ON ProbeSetFreeze.ProbeFreezeId=ProbeFreeze.Id
- INNER JOIN ProbeSetXRef ON ProbeSetXRef.ProbeSetFreezeId=ProbeSetFreeze.Id
- INNER JOIN ProbeSet ON ProbeSet.Id = ProbeSetXRef.ProbeSetId
- LEFT JOIN Geno ON ProbeSetXRef.Locus = Geno.Name AND Geno.SpeciesId = Species.Id
- WHERE ( MATCH (ProbeSet.Name,ProbeSet.description,ProbeSet.symbol,ProbeSet.alias,ProbeSet.GenbankId, ProbeSet.UniGeneId, ProbeSet.Probe_Target_Description) AGAINST ('%s' IN BOOLEAN MODE) )
- AND ProbeSetFreeze.confidentiality < 1
- AND ProbeSetFreeze.public > 0
- ORDER BY species_name, inbredset_name, tissue_name, probesetfreeze_name, probeset_name
- LIMIT 6000
- """ % (self.terms)
- re = g.db.execute(sql).fetchall()
+ _result = ()
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT Species.`Name` AS species_name, "
+ "InbredSet.`Name` AS inbredset_name, "
+ "Tissue.`Name` AS tissue_name, "
+ "ProbeSetFreeze.Name AS probesetfreeze_name, "
+ "ProbeSetFreeze.FullName AS "
+ "probesetfreeze_fullname, ProbeSet.Name AS "
+ "probeset_name, ProbeSet.Symbol AS "
+ "probeset_symbol, CAST(ProbeSet.`description` AS BINARY) "
+ "AS probeset_description, ProbeSet.Chr AS chr, "
+ "ProbeSet.Mb AS mb, ProbeSetXRef.Mean AS mean, "
+ "ProbeSetXRef.LRS AS lrs, ProbeSetXRef.`Locus` "
+ "AS locus, ProbeSetXRef.`pValue` AS , "
+ "ProbeSetXRef.`additive` AS additive, "
+ "ProbeSetFreeze.Id AS probesetfreeze_id, "
+ "Geno.Chr as geno_chr, Geno.Mb as geno_mb "
+ "FROM Species INNER JOIN InbredSet ON "
+ "InbredSet.`SpeciesId`=Species.`Id` "
+ "INNER JOIN ProbeFreeze ON "
+ "ProbeFreeze.InbredSetId=InbredSet.`Id` "
+ "INNER JOIN Tissue ON ProbeFreeze.`TissueId`=Tissue.`Id` "
+ "INNER JOIN ProbeSetFreeze ON "
+ "ProbeSetFreeze.ProbeFreezeId=ProbeFreeze.Id "
+ "INNER JOIN ProbeSetXRef ON "
+ "ProbeSetXRef.ProbeSetFreezeId=ProbeSetFreeze.Id "
+ "INNER JOIN ProbeSet ON "
+ "ProbeSet.Id = ProbeSetXRef.ProbeSetId "
+ "LEFT JOIN Geno ON ProbeSetXRef.Locus = Geno.Name "
+ "AND Geno.SpeciesId = Species.Id WHERE "
+ "( MATCH "
+ "(ProbeSet.Name, ProbeSet.description, ProbeSet.symbol, "
+ "ProbeSet.alias, ProbeSet.GenbankId, ProbeSet.UniGeneId, "
+ "ProbeSet.Probe_Target_Description) "
+ "AGAINST (%s IN BOOLEAN MODE) ) "
+ "AND ProbeSetFreeze.confidentiality < 1 AND "
+ "ProbeSetFreeze.public > 0 ORDER BY species_name, "
+ "inbredset_name, tissue_name, probesetfreeze_name, "
+ "probeset_name LIMIT 6000", (self.terms,)
+ )
+ _result = cursor.fetchall()
trait_list = []
dataset_to_permissions = {}
- for i, line in enumerate(re):
+ for i, line in enumerate(_result):
this_trait = {}
this_trait['index'] = i + 1
this_trait['name'] = line[5]
@@ -168,44 +175,43 @@ class GSearch:
search_term = self.terms.split("_")[1]
group_clause = "AND InbredSet.`InbredSetCode` = '{}'".format(
self.terms.split("_")[0])
- sql = """
- SELECT
- Species.`Name`,
- InbredSet.`Name`,
- PublishFreeze.`Name`,
- PublishFreeze.`FullName`,
- PublishXRef.`Id`,
- CAST(Phenotype.`Pre_publication_description` AS BINARY),
- CAST(Phenotype.`Post_publication_description` AS BINARY),
- Publication.`Authors`,
- Publication.`Year`,
- Publication.`PubMed_ID`,
- PublishXRef.`LRS`,
- PublishXRef.`additive`,
- InbredSet.`InbredSetCode`,
- PublishXRef.`mean`,
- PublishFreeze.Id,
- Geno.Chr as geno_chr,
- Geno.Mb as geno_mb
- FROM Species
- INNER JOIN InbredSet ON InbredSet.`SpeciesId`=Species.`Id`
- INNER JOIN PublishFreeze ON PublishFreeze.`InbredSetId`=InbredSet.`Id`
- INNER JOIN PublishXRef ON PublishXRef.`InbredSetId`=InbredSet.`Id`
- INNER JOIN Phenotype ON PublishXRef.`PhenotypeId`=Phenotype.`Id`
- INNER JOIN Publication ON PublishXRef.`PublicationId`=Publication.`Id`
- LEFT JOIN Geno ON PublishXRef.Locus = Geno.Name AND Geno.SpeciesId = Species.Id
- WHERE
- (
- (MATCH (Phenotype.Post_publication_description, Phenotype.Pre_publication_description, Phenotype.Pre_publication_abbreviation, Phenotype.Post_publication_abbreviation, Phenotype.Lab_code) AGAINST ('{1}' IN BOOLEAN MODE) )
- OR (MATCH (Publication.Abstract, Publication.Title, Publication.Authors) AGAINST ('{1}' IN BOOLEAN MODE) )
+ _result = ()
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT Species.`Name`, InbredSet.`Name`, "
+ "PublishFreeze.`Name`, PublishFreeze.`FullName`, "
+ "PublishXRef.`Id`, CAST(Phenotype.`Pre_publication_description` "
+ "AS BINARY), CAST(Phenotype.`Post_publication_description` "
+ "AS BINARY), Publication.`Authors`, Publication.`Year`, "
+ "Publication.`PubMed_ID`, PublishXRef.`LRS`, "
+ "PublishXRef.`additive`, InbredSet.`InbredSetCode`, "
+ "PublishXRef.`mean`, PublishFreeze.Id, Geno.Chr as geno_chr, "
+ "Geno.Mb as geno_mb FROM Species "
+ "INNER JOIN InbredSet ON InbredSet.`SpeciesId`=Species.`Id` "
+ "INNER JOIN PublishFreeze ON "
+ "PublishFreeze.`InbredSetId`=InbredSet.`Id` "
+ "INNER JOIN PublishXRef ON "
+ "PublishXRef.`InbredSetId`=InbredSet.`Id` "
+ "INNER JOIN Phenotype ON "
+ "PublishXRef.`PhenotypeId`=Phenotype.`Id` "
+ "INNER JOIN Publication ON "
+ "PublishXRef.`PublicationId`=Publication.`Id` "
+ "LEFT JOIN Geno ON PublishXRef.Locus = Geno.Name "
+ "AND Geno.SpeciesId = Species.Id WHERE "
+ "((MATCH (Phenotype.Post_publication_description, "
+ "Phenotype.Pre_publication_description, "
+ "Phenotype.Pre_publication_abbreviation, "
+ "Phenotype.Post_publication_abbreviation, "
+ "Phenotype.Lab_code) AGAINST (%s IN BOOLEAN MODE) ) "
+ "OR (MATCH (Publication.Abstract, Publication.Title, "
+ "Publication.Authors) AGAINST (%s IN BOOLEAN MODE) ) "
+ ") %s ORDER BY Species.`Name`, InbredSet.`Name`, "
+ "PublishXRef.`Id` LIMIT 6000",
+ (search_term, search_term, group_clause,)
)
- {0}
- ORDER BY Species.`Name`, InbredSet.`Name`, PublishXRef.`Id`
- LIMIT 6000
- """.format(group_clause, search_term)
- re = g.db.execute(sql).fetchall()
+ _result = cursor.fetchall()
trait_list = []
- for i, line in enumerate(re):
+ for i, line in enumerate(_result):
trait_dict = {}
trait_dict['index'] = i + 1
trait_dict['name'] = str(line[4])
diff --git a/wqflask/wqflask/interval_analyst/GeneUtil.py b/wqflask/wqflask/interval_analyst/GeneUtil.py
index 5e86ae31..6adf528f 100644
--- a/wqflask/wqflask/interval_analyst/GeneUtil.py
+++ b/wqflask/wqflask/interval_analyst/GeneUtil.py
@@ -1,11 +1,9 @@
import string
-from flask import Flask, g
+from wqflask.database import database_connection
# Just return a list of dictionaries
# each dictionary contains sub-dictionary
-
-
def loadGenes(chrName, diffCol, startMb, endMb, species='mouse'):
fetchFields = ['SpeciesId', 'Id', 'GeneSymbol', 'GeneDescription', 'Chromosome', 'TxStart', 'TxEnd',
'Strand', 'GeneID', 'NM_ID', 'kgID', 'GenBankID', 'UnigenID', 'ProteinID', 'AlignID',
@@ -13,94 +11,101 @@ def loadGenes(chrName, diffCol, startMb, endMb, species='mouse'):
# List All Species in the Gene Table
speciesDict = {}
- results = g.db.execute("""
- SELECT Species.Name, GeneList.SpeciesId
- FROM Species, GeneList
- WHERE GeneList.SpeciesId = Species.Id
- GROUP BY GeneList.SpeciesId""").fetchall()
-
- for item in results:
- speciesDict[item[0]] = item[1]
-
- # List current Species and other Species
- speciesId = speciesDict[species]
- otherSpecies = [[X, speciesDict[X]] for X in list(speciesDict.keys())]
- otherSpecies.remove([species, speciesId])
-
- results = g.db.execute("""
- SELECT %s FROM GeneList
- WHERE SpeciesId = %d AND
- Chromosome = '%s' AND
- ((TxStart > %f and TxStart <= %f) OR (TxEnd > %f and TxEnd <= %f))
- ORDER BY txStart
- """ % (", ".join(fetchFields),
- speciesId, chrName,
- startMb, endMb,
- startMb, endMb)).fetchall()
-
- GeneList = []
-
- if results:
- for result in results:
- newdict = {}
- for j, item in enumerate(fetchFields):
- newdict[item] = result[j]
- # count SNPs if possible
- if diffCol and species == 'mouse':
- newdict["snpCount"] = g.db.execute("""
- SELECT count(*)
- FROM BXDSnpPosition
- WHERE Chr = '%s' AND
- Mb >= %2.6f AND Mb < %2.6f AND
- StrainId1 = %d AND StrainId2 = %d
- """ % (chrName, newdict["TxStart"], newdict["TxEnd"], diffCol[0], diffCol[1])).fetchone()[0]
- newdict["snpDensity"] = newdict["snpCount"] / \
- (newdict["TxEnd"] - newdict["TxStart"]) / 1000.0
- else:
- newdict["snpDensity"] = newdict["snpCount"] = 0
-
- try:
- newdict['GeneLength'] = 1000.0 * \
- (newdict['TxEnd'] - newdict['TxStart'])
- except:
- pass
-
- # load gene from other Species by the same name
- for item in otherSpecies:
- othSpec, othSpecId = item
- newdict2 = {}
-
- resultsOther = g.db.execute("SELECT %s FROM GeneList WHERE SpeciesId = %d AND geneSymbol= '%s' LIMIT 1" % (", ".join(fetchFields),
- othSpecId,
- newdict["GeneSymbol"])).fetchone()
-
- if resultsOther:
- for j, item in enumerate(fetchFields):
- newdict2[item] = resultsOther[j]
-
- # count SNPs if possible, could be a separate function
- if diffCol and othSpec == 'mouse':
- newdict2["snpCount"] = g.db.execute("""
- SELECT count(*)
- FROM BXDSnpPosition
- WHERE Chr = '%s' AND
- Mb >= %2.6f AND Mb < %2.6f AND
- StrainId1 = %d AND StrainId2 = %d
- """ % (chrName, newdict["TxStart"], newdict["TxEnd"], diffCol[0], diffCol[1])).fetchone()[0]
-
- newdict2["snpDensity"] = newdict2["snpCount"] / \
- (newdict2["TxEnd"] - newdict2["TxStart"]) / 1000.0
- else:
- newdict2["snpDensity"] = newdict2["snpCount"] = 0
-
- try:
- newdict2['GeneLength'] = 1000.0 * \
- (newdict2['TxEnd'] - newdict2['TxStart'])
- except:
- pass
-
- newdict['%sGene' % othSpec] = newdict2
-
- GeneList.append(newdict)
-
- return GeneList
+ results = []
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute("SELECT Species.Name, GeneList.SpeciesId"
+ "FROM Species, GeneList WHERE "
+ "GeneList.SpeciesId = Species.Id "
+ "GROUP BY GeneList.SpeciesId")
+ results = cursor.fetchall()
+ for item in results:
+ speciesDict[item[0]] = item[1]
+
+ # List current Species and other Species
+ speciesId = speciesDict[species]
+ otherSpecies = [[X, speciesDict[X]] for X in list(speciesDict.keys())]
+ otherSpecies.remove([species, speciesId])
+ cursor.execute("SELECT %s FROM GeneList "
+ "WHERE SpeciesId = %d AND "
+ "Chromosome = %s AND "
+ "((TxStart > %s and TxStart <= %s) "
+ "OR (TxEnd > %s and TxEnd <= %s)) "
+ "ORDER BY txStart",
+ (", ".join(fetchFields),
+ speciesId, chrName,
+ startMb, endMb,
+ startMb, endMb))
+ results = cursor.fetchall()
+
+ GeneList = []
+ if results:
+ for result in results:
+ newdict = {}
+ for j, item in enumerate(fetchFields):
+ newdict[item] = result[j]
+ # count SNPs if possible
+ if diffCol and species == 'mouse':
+ cursor.execute(
+ "SELECT count(*) FROM BXDSnpPosition "
+ "WHERE Chr = '%s' AND "
+ "Mb >= %s AND Mb < %s "
+ "AND StrainId1 = %s AND StrainId2 = %s",
+ (chrName, f"{newdict['TxStart']:2.6f}",
+ f"{newdict['TxEnd']:2.6f}",
+ diffCol[0], diffCol[1],))
+ newdict["snpCount"] = cursor.fetchone()[0]
+ newdict["snpDensity"] = (
+ newdict["snpCount"] /
+ (newdict["TxEnd"] - newdict["TxStart"]) / 1000.0)
+ else:
+ newdict["snpDensity"] = newdict["snpCount"] = 0
+ try:
+ newdict['GeneLength'] = 1000.0 * \
+ (newdict['TxEnd'] - newdict['TxStart'])
+ except:
+ pass
+ # load gene from other Species by the same name
+ for item in otherSpecies:
+ othSpec, othSpecId = item
+ newdict2 = {}
+ cursor.execute(
+ "SELECT %s FROM GeneList WHERE "
+ "SpeciesId = %s AND "
+ "geneSymbol= '%s' LIMIT 1",
+ (", ".join(fetchFields),
+ othSpecId,
+ newdict["GeneSymbol"]))
+ resultsOther = cursor.fetchone()
+ if resultsOther:
+ for j, item in enumerate(fetchFields):
+ newdict2[item] = resultsOther[j]
+
+ # count SNPs if possible, could be a separate function
+ if diffCol and othSpec == 'mouse':
+ cursor.execute(
+ "SELECT count(*) FROM BXDSnpPosition "
+ "WHERE Chr = %s AND Mb >= %2.6f AND "
+ "Mb < %2.6f AND StrainId1 = %d "
+ "AND StrainId2 = %d",
+ (chrName, f"{newdict['TxStart']:2.6f}",
+ f"{newdict['TxEnd']:2.6f}",
+ diffCol[0], diffCol[1]))
+ if snp_count := cursor.fetchone():
+ newdict2["snpCount"] = snp_count[0]
+
+ newdict2["snpDensity"] = (
+ newdict2["snpCount"]
+ / (newdict2["TxEnd"] - newdict2["TxStart"])
+ / 1000.0)
+ else:
+ newdict2["snpDensity"] = newdict2["snpCount"] = 0
+ try:
+ newdict2['GeneLength'] = (
+ 1000.0 * (newdict2['TxEnd'] - newdict2['TxStart']))
+ except:
+ pass
+
+ newdict['%sGene' % othSpec] = newdict2
+
+ GeneList.append(newdict)
+ return GeneList
diff --git a/wqflask/wqflask/show_trait/SampleList.py b/wqflask/wqflask/show_trait/SampleList.py
index ae30aa59..cc6b8e23 100644
--- a/wqflask/wqflask/show_trait/SampleList.py
+++ b/wqflask/wqflask/show_trait/SampleList.py
@@ -1,7 +1,7 @@
import re
import itertools
-from flask import g
+from wqflask.database import database_connection
from base import webqtlCaseData, webqtlConfig
from pprint import pformat as pf
@@ -123,15 +123,20 @@ class SampleList:
"""Finds which extra attributes apply to this dataset"""
# Get attribute names and distinct values for each attribute
- results = g.db.execute('''
- SELECT DISTINCT CaseAttribute.Id, CaseAttribute.Name, CaseAttribute.Description, CaseAttributeXRefNew.Value
- FROM CaseAttribute, CaseAttributeXRefNew
- WHERE CaseAttributeXRefNew.CaseAttributeId = CaseAttribute.Id
- AND CaseAttributeXRefNew.InbredSetId = %s
- ORDER BY CaseAttribute.Id''', (str(self.dataset.group.id),))
-
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT DISTINCT CaseAttribute.Id, "
+ "CaseAttribute.Name, CaseAttribute.Description, "
+ "CaseAttributeXRefNew.Value FROM "
+ "CaseAttribute, CaseAttributeXRefNew WHERE "
+ "CaseAttributeXRefNew.CaseAttributeId = CaseAttribute.Id "
+ "AND CaseAttributeXRefNew.InbredSetId = %s "
+ "ORDER BY CaseAttribute.Id", (str(self.dataset.group.id),)
+ )
self.attributes = {}
- for attr, values in itertools.groupby(results.fetchall(), lambda row: (row.Id, row.Name, row.Description)):
+ for attr, values in itertools.groupby(
+ cursor.fetchall(), lambda row: (row.Id, row.Name, row.Description)
+ ):
key, name, description = attr
self.attributes[key] = Bunch()
self.attributes[key].id = key
@@ -156,19 +161,23 @@ class SampleList:
def get_extra_attribute_values(self):
if self.attributes:
- query = '''
- SELECT Strain.Name AS SampleName, CaseAttributeId AS Id, CaseAttributeXRefNew.Value
- FROM Strain, StrainXRef, InbredSet, CaseAttributeXRefNew
- WHERE StrainXRef.StrainId = Strain.Id
- AND InbredSet.Id = StrainXRef.InbredSetId
- AND CaseAttributeXRefNew.StrainId = Strain.Id
- AND InbredSet.Id = CaseAttributeXRefNew.InbredSetId
- AND CaseAttributeXRefNew.InbredSetId = %s
- ORDER BY SampleName''' % self.dataset.group.id
-
- results = g.db.execute(query)
-
- for sample_name, items in itertools.groupby(results.fetchall(), lambda row: row.SampleName):
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT Strain.Name AS SampleName, "
+ "CaseAttributeId AS Id, "
+ "CaseAttributeXRefNew.Value FROM Strain, "
+ "StrainXRef, InbredSet, CaseAttributeXRefNew "
+ "WHERE StrainXRef.StrainId = Strain.Id "
+ "AND InbredSet.Id = StrainXRef.InbredSetId "
+ "AND CaseAttributeXRefNew.StrainId = Strain.Id "
+ "AND InbredSet.Id = CaseAttributeXRefNew.InbredSetId "
+ "AND CaseAttributeXRefNew.InbredSetId = %s "
+ "ORDER BY SampleName", (self.dataset.group.id,)
+ )
+
+ for sample_name, items in itertools.groupby(
+ cursor.fetchall(), lambda row: row.SampleName
+ ):
attribute_values = {}
# Make a list of attr IDs without values (that have values for other samples)
valueless_attr_ids = [self.attributes[key].id for key in self.attributes.keys()]
diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py
index c1d9ad84..b12b6ba0 100644
--- a/wqflask/wqflask/show_trait/show_trait.py
+++ b/wqflask/wqflask/show_trait/show_trait.py
@@ -11,7 +11,7 @@ from collections import OrderedDict
import numpy as np
import scipy.stats as ss
-from flask import g
+from wqflask.database import database_connection
from base import webqtlConfig
from wqflask.show_trait.SampleList import SampleList
@@ -84,14 +84,21 @@ class ShowTrait:
blatsequence = self.this_trait.blatseq
if not blatsequence:
# XZ, 06/03/2009: ProbeSet name is not unique among platforms. We should use ProbeSet Id instead.
- query1 = """SELECT Probe.Sequence, Probe.Name
- FROM Probe, ProbeSet, ProbeSetFreeze, ProbeSetXRef
- WHERE ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id AND
- ProbeSetXRef.ProbeSetId = ProbeSet.Id AND
- ProbeSetFreeze.Name = '%s' AND
- ProbeSet.Name = '%s' AND
- Probe.ProbeSetId = ProbeSet.Id order by Probe.SerialOrder""" % (self.this_trait.dataset.name, self.this_trait.name)
- seqs = g.db.execute(query1).fetchall()
+ seqs = ()
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT Probe.Sequence, Probe.Name "
+ "FROM Probe, ProbeSet, ProbeSetFreeze, "
+ "ProbeSetXRef WHERE "
+ "ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id "
+ "AND ProbeSetXRef.ProbeSetId = ProbeSet.Id AND "
+ "ProbeSetFreeze.Name = %s AND "
+ "ProbeSet.Name = %s AND "
+ "Probe.ProbeSetId = ProbeSet.Id ORDER "
+ "BY Probe.SerialOrder",
+ (self.this_trait.dataset.name, self.this_trait.name,)
+ )
+ seqs = cursor.fetchall()
if not seqs:
raise ValueError
else:
@@ -104,15 +111,20 @@ class ShowTrait:
blatsequence = '%3E' + self.this_trait.name + '%0A' + blatsequence + '%0A'
# XZ, 06/03/2009: ProbeSet name is not unique among platforms. We should use ProbeSet Id instead.
- query2 = """SELECT Probe.Sequence, Probe.Name
- FROM Probe, ProbeSet, ProbeSetFreeze, ProbeSetXRef
- WHERE ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id AND
- ProbeSetXRef.ProbeSetId = ProbeSet.Id AND
- ProbeSetFreeze.Name = '%s' AND
- ProbeSet.Name = '%s' AND
- Probe.ProbeSetId = ProbeSet.Id order by Probe.SerialOrder""" % (self.this_trait.dataset.name, self.this_trait.name)
-
- seqs = g.db.execute(query2).fetchall()
+ seqs = ()
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT Probe.Sequence, Probe.Name "
+ "FROM Probe, ProbeSet, ProbeSetFreeze, "
+ "ProbeSetXRef WHERE "
+ "ProbeSetXRef.ProbeSetFreezeId = ProbeSetFreeze.Id "
+ "AND ProbeSetXRef.ProbeSetId = ProbeSet.Id AND "
+ "ProbeSetFreeze.Name = %s AND ProbeSet.Name = %s "
+ "AND Probe.ProbeSetId = ProbeSet.Id "
+ "ORDER BY Probe.SerialOrder",
+ (self.this_trait.dataset.name, self.this_trait.name,)
+ )
+ seqs = cursor.fetchall()
for seqt in seqs:
if int(seqt[1][-1]) % 2 == 1:
blatsequence += '%3EProbe_' + \
@@ -378,12 +390,14 @@ class ShowTrait:
if self.dataset.group.species == "mouse":
self.aba_link = webqtlConfig.ABA_URL % self.this_trait.symbol
-
- query = """SELECT chromosome, txStart, txEnd
- FROM GeneList
- WHERE geneSymbol = '{}'""".format(self.this_trait.symbol)
-
- results = g.db.execute(query).fetchone()
+ results = ()
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT chromosome, txStart, txEnd FROM "
+ "GeneList WHERE geneSymbol = %s",
+ (self.this_trait.symbol,)
+ )
+ results = cursor.fetchone()
if results:
chr, transcript_start, transcript_end = results
else:
@@ -403,15 +417,17 @@ class ShowTrait:
self.genemania_link = webqtlConfig.GENEMANIA_URL % (
"rattus-norvegicus", self.this_trait.symbol)
- query = """SELECT kgID, chromosome, txStart, txEnd
- FROM GeneList_rn33
- WHERE geneSymbol = '{}'""".format(self.this_trait.symbol)
-
- results = g.db.execute(query).fetchone()
- if results:
- kgId, chr, transcript_start, transcript_end = results
- else:
- kgId = chr = transcript_start = transcript_end = None
+ results = ()
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT kgID, chromosome, txStart, txEnd "
+ "FROM GeneList_rn33 WHERE geneSymbol = %s",
+ (self.this_trait.symbol,)
+ )
+ if results := cursor.fetchone():
+ kgId, chr, transcript_start, transcript_end = results
+ else:
+ kgId = chr = transcript_start = transcript_end = None
if chr and transcript_start and transcript_end and kgId:
# Convert to bases from megabases
@@ -605,19 +621,19 @@ def get_nearest_marker(this_trait, this_db):
this_mb = this_trait.locus_mb
# One option is to take flanking markers, another is to take the
# two (or one) closest
- query = """SELECT Geno.Name
- FROM Geno, GenoXRef, GenoFreeze
- WHERE Geno.Chr = '{}' AND
- GenoXRef.GenoId = Geno.Id AND
- GenoFreeze.Id = GenoXRef.GenoFreezeId AND
- GenoFreeze.Name = '{}'
- ORDER BY ABS( Geno.Mb - {}) LIMIT 1""".format(this_chr, this_db.group.name + "Geno", this_mb)
- result = g.db.execute(query).fetchall()
-
- if result == []:
+ with database_connection() as conn, conn.cursor() as cursor:
+ cursor.execute(
+ "SELECT Geno.Name FROM Geno, GenoXRef, "
+ "GenoFreeze WHERE Geno.Chr = %s AND "
+ "GenoXRef.GenoId = Geno.Id AND "
+ "GenoFreeze.Id = GenoXRef.GenoFreezeId "
+ "AND GenoFreeze.Name = %s ORDER BY "
+ "ABS( Geno.Mb - %s) LIMIT 1",
+ (this_chr, f"{this_db.group.name}Geno", this_mb,)
+ )
+ if result := cursor.fetchall():
+ return result[0][0]
return ""
- else:
- return result[0][0]
def get_table_widths(sample_groups, sample_column_width, has_num_cases=False):