【发布时间】:2014-02-08 14:34:37
【问题描述】:
我正在尝试使用 SQLAlchemy 将一些记录插入到具有外键的数据库中,但外键似乎没有像我预期的那样发生变化。
我在账户和交易这两个对象之间有一个简单的 1-M 关系。 Account 对象已很好地插入到数据库中,但是当我尝试迭代这些帐户并向它们添加事务对象时,所有事务的外键都是被迭代的最后一个帐户的 id。
谁能帮我弄清楚这是为什么?它一直让我发疯!
我的账户和交易对象:
class Account(db.Model):
number = db.Column(db.String(80), primary_key=True)
bsb = db.Column(db.String(80), primary_key=True)
name = db.Column(db.String(80))
description = db.Column(db.String(80))
class Transaction(db.Model):
id = db.Column(db.Integer, primary_key=True)
account_id = db.Column(db.String(80), db.ForeignKey('account.number'))
amount = db.Column(db.Float(precprecision=2))
这是我在数据库中迭代帐户并尝试向它们添加事务对象的地方:
def Sync_Transactions():
#The following definately returns two account objects from the DB
accounts = [db.session.query(Account).filter(Account.number == '999999999').first(), db.session.query(Account).filter(Account.number == '222222222').first()]
for acc in accounts:
#The following parses a CSV file for the account and returns transaction objecs as a list
transactions = myLib.ParseCsvFile('C:\\transactions_%s.csv' % (acc.number))
acc.transactions = transactions
db.session.merge(acc)
db.session.commit()
以上,如果从 db 中只检索到 1 个帐户,则可以正常工作。一旦我开始迭代多个帐户,所有交易都会获得相同的外键(最后一个帐户的键 - 在上述情况下为 222222222)
这就是问题所在
def ParseCsvFile(self, fileLocation, existingTransactionList=[]):
with open(fileLocation, 'rb') as f:
reader = csv.DictReader(f,['Date','TransactionAmount','C','D','TransactionType','TransactionDescription','Balance'])
for row in reader:
if not row['TransactionDescription'] == '':
existingTransactionList.append(Transaction(
float(row['TransactionAmount'])
)
)
return existingTransactionList
由于某种原因,参数 existingTransactionList 会导致问题。如果我将上面的代码更改为以下代码,问题就消失了,但我仍然不明白为什么由于我缺乏 python 知识我猜:)
def ParseCsvFile(self, fileLocation, existingTransactionList=[]):
existingTransactionList=[]
with open(fileLocation, 'rb') as f:
reader = csv.DictReader(f,['Date','TransactionAmount','C','D','TransactionType','TransactionDescription','Balance'])
for row in reader:
if not row['TransactionDescription'] == '':
existingTransactionList.append(Transaction(
float(row['TransactionAmount'])
)
)
return existingTransactionList
我将 existingTransactionList 变量作为参数的原因是,我最终会希望传入现有交易的列表,并且只有唯一的交易会通过以下方式返回:
transactionList = list(set(existingTransactionList))
【问题讨论】:
-
看来你需要展示 ParseCsvFile 方法。
-
谢谢!问题确实出在 ParseCsvFile 方法中,但我仍然不知道为什么会出现问题。我已将代码添加到帖子中。
标签: python mysql database sqlalchemy flask