使用外部脚本写入 Django sqlite 数据库

时间:2021-02-10 02:34:17

标签: python django sqlite

我不知道我正在尝试做的事情是否最有意义,或者是否有更好的方法来做到这一点。但是,我正在学习如何使用 django 构建网站。我想知道,我可以使用每天运行的外部 python 脚本来获取股票信息,并将其发布到我的 django 网站数据库吗?

我创建了一个 Stock 类,如下所示:

class Stock(models.Model):
    def __str__(self):
        return self.name
    name = models.CharField(max_length=50)
    ticker = models.CharField(max_length=5)
    price = models.DecimalField(max_digits=100, decimal_places=2)
    date = models.DateField()

然后我运行一个 python 脚本,将股票数据拉下来并尝试写入数据库,如下所示:

dfDatabase = dfCurrentDay[['Ticker', 'Company', 'Close', 'Date']]
con = db.connect(r'C:\Users\shawn\Dev\stockshome\trying_django\src\db.sqlite3')
dfDatabase.to_sql('Stock', con=con, if_exists='replace')
data = con.execute("SELECT * FROM Stock").fetchall()
print(data)

当我打印数据时,它返回适当的值。但是,当我转到网页时,它显示为空白。那是因为我的视图做错了什么,还是我在尝试写入数据库时​​做错了什么?

我应该采用不同的方式来处理这个想法吗?我设想有基于股票部门或市值大小等的各种页面,我希望有一个包含股票信息表的页面,然后是指向另一个页面的超链接,该页面将显示图表或更详细的财务数据.

2 个答案:

答案 0 :(得分:0)

因此,您希望定期从外部来源提取数据并将该数据转储到您的数据库中。一种方法是例行运行批处理作业,例如在特定时间或特定时间段后运行的 celery 调度程序。所以,你会有一些类似这样的任务

@app.task
def pull_data():
    data = requests.get(your URL)
    #now you can do a bulk insert to the Database
    #assuming data is json data
    data = json.loads(data) #will convert json to dict
    #parse the data either by looping or however your data is structured and then
    #insert the data into the stock table.
    from .models import Stock
    stock,_ = Stock.objects.update_or_create(name=data['name']......)

此外,如果您想在稍后阶段进行 READ 查询,请考虑为您的 Stock 表编制索引。

Something like this
 @app.task(name='pull_and_dump')
 def pull_data_and_insert():
          response = requests.get('https://jsonplaceholder.typicode.com/posts')
        content = json.loads(response.content)
        for i in range(len(content)):
            dump,_ = DumpData.objects.update_or_create(u_id=content[i]['userId'],title=content[i]['title'])



     

答案 1 :(得分:0)

这个不行的原因是Django创建的表没有叫Stock。 Django 将使用应用程序名称作为模型名称的前缀。因此,例如,如果您的应用程序名为“testapp”,则 Django 会将表创建为 testapp_stock

它显然有效的原因是 .to_sql() 将删除并重新创建表。您应该能够在 sqlite3 数据库中找到一个名为 Stock 的表,其中包含您上次尝试的数据。

还有一些其他问题。首先,您的代码删除现有表并在插入数据框中的行之前重新创建它。但是,数据框中的列名与 Django 模型的列名不匹配,因此 Django 将无法再使用该表而不会爆炸。

此外,Django 为表创建了一个自动递增的“id”列。如果它是外键或其他,其他表可能会引用此列。删除并重新创建表可能会导致引用完整性问题。

另一个问题是 sqlite 不是特别擅长处理来自不同客户端的多个并发写入。在从 .to_sql() 进行删除/重新加载的同时,Django 可能正在写入表。

您可以更正表名和列名,但是,我不确定您是否应该这样做。为了帮助您做出决定,您可以查看一些关于同一主题的较旧问题。第二个看起来有点眼熟:

相关问题