0

単一のデータベース テーブルから情報を取得し、毎週の更新メールをユーザーに送信する Python スクリプトがあります。コードを変更して、構造を正規化し、すべての調査員情報 (プレフィックス、fname、lname、および電子メール) を独自のテーブルに入れる方法を見つけたいと考えています。ただし、エリクサー モデルと私の python コードの構造内でこれを行う方法がわかりません。

これが私の現在のエリクサーモデルファイルです:

from elixir import *
import auth as auth
au = auth.UserAuth()

metadata.bind = 'mysql://' + au.user + ':' + au.password + '@localhost/' + au.database
metadata.bind.echo = True


class Protocol(Entity):
    id = Field(Integer, primary_key = True)
    irb_no = Field(Text)
    title = Field(Text)
    prefix = Field(Text)
    fname = Field(Text)
    lname = Field(Text)
    email = Field(Text)
    action_date = Field(Date)
    action = Field(Text)
    approved = Field(Integer)
    using_options(tablename = 'protocols')

    def __repr__ (self):
        return '%d' %(self.id)

そして、ここに私のpythonスクリプトがあります:

import smtplib
import auth as auth
import ProtocolModel as PM
from elixir import *
from datetime import datetime

au = auth.UserAuth()
setup_all()
create_all()
table = PM.Protocol
records = table.query.all()

if len(records) == 0:
    print 'No records in Table'
else:
    for record in records:
        setup_all()
        if record.approved == 1:
            print 'Completed'
        else:
            FROMADDR = au.google_user
            LOGIN    = FROMADDR
            PASSWORD = au.google_password
            TOADDRS  = record.email
            SUBJECT  = "Weekly Research Update for " + record.irb_no + " - " + record.title
            date1 = datetime.strptime(str(record.action_date), '%Y-%m-%d')
            date2 = date1.strftime('%B %d, %Y')
            msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (FROMADDR, ", ".join(TOADDRS), SUBJECT) )
            msg += 'Dear' + ' ' + record.prefix + ' ' + record.fname + ' ' + record.lname + ',' + '\n' + '\n'
            msg += 'Our records indicate that the most recent action on your research protocol titled ' + record.title + ' was taken on ' + str(date2) +'.' +'\n'
            msg += 'This action was: ' + record.action

            server = smtplib.SMTP('smtp.gmail.com', 587)
            server.set_debuglevel(1)
            server.ehlo()
            server.starttls()
            server.login(LOGIN, PASSWORD)
            server.sendmail(FROMADDR, TOADDRS, msg)
            server.quit()

これは比較的単純な変更であるように思われますが、どうすればよいかわかりません。どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

0

私はそれを考え出した。モデル ファイルの新しいエンティティ クラスで ManyToOne を使用し、Python コードでそれを参照しました。私がそれに戻ったとき、それは簡単な修正でした。

新しいエリクサーモデル:

from elixir import *
import auth as auth
au = auth.UserAuth()

metadata.bind = 'mysql://' + au.user + ':' + au.password + '@localhost/' + au.database
metadata.bind.echo = True

class Investigator(Entity):
    id = Field(Integer, primary_key = True)
    prefix = Field(Text)
    fname = Field(Text)
    lname = Field(Text)
    email = Field(Text)
    using_options(tablename = 'investigators')

    def __repr__ (self):
        return '%d' %(self.id)


class Protocol(Entity):
    id = Field(Integer, primary_key = True)
    irb_no = Field(Text)
    title = Field(Text)
    investigator = ManyToOne('Investigator', colname='investigator_id')
    action_date = Field(Date)
    action = Field(Text)
    approved = Field(Integer)
    using_options(tablename = 'protocols')

    def __repr__ (self):
        return '%d' %(self.id)

新しい python スクリプト:

import smtplib
import auth as auth
import ProtocolModel1 as PM
from elixir import *
from datetime import datetime

au = auth.UserAuth()
setup_all()
create_all()
table = PM.Protocol
records = table.query.all()

if len(records) == 0:
    print 'No records in Table'
else:
    for record in records:
        setup_all()
        if record.approved == 1:
            print 'Completed'
        else:
            FROMADDR = au.google_user
            LOGIN    = FROMADDR
            PASSWORD = au.google_password
            TOADDRS  = record.investigator.email
            SUBJECT  = "Weekly Research Update for " + record.irb_no + " - " + record.title
            date1 = datetime.strptime(str(record.action_date), '%Y-%m-%d')
            date2 = date1.strftime('%B %d, %Y')
            msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (FROMADDR, ", ".join(TOADDRS), SUBJECT) )
            msg += 'Dear' + ' ' + record.investigator.prefix + ' ' + record.investigator.fname + ' ' + record.investigator.lname + ',' + '\n' + '\n'
            msg += 'Our records indicate that the most recent action on your research protocol titled ' + record.title + ' was taken on ' + str(date2) +'.' +'\n'
            msg += 'This action was: ' + record.action

            server = smtplib.SMTP('smtp.gmail.com', 587)
            server.set_debuglevel(1)
            server.ehlo()
            server.starttls()
            server.login(LOGIN, PASSWORD)
            server.sendmail(FROMADDR, TOADDRS, msg)
            server.quit()
于 2013-02-21T16:17:43.847 に答える