SQLAlchemy使用默认值大容量插入缺少的值

2024-03-28 11:36:38 发布

您现在位置:Python中文网/ 问答频道 /正文

问题陈述-

我想使用SQLAlchemy大容量插入几百行。模式如下所示

all_scrips_tbl = Table('all_scrips_info', _METADATA, Column('security_isin', String(16), primary_key=True), Column('company_name', String(80)), Column('nse_traded', Boolean, default=False), Column('nse_start_date', Date, default=datetime.date(year=2001, day=1, month=1)), Column('bse_traded', Boolean, default=False), Column('bse_start_date', Date, default=datetime.date(year=2001, day=1, month=1)), ) 现在每个脚本可以是-nse_traded=Truebse_traded=True,或者两者都是nse_traded=True and bse_traded=True

所以我有插入语句,比如-

对于只有nse_traded=True的证券 ins = t.insert().values(security_isin=nstock.isin, company_name=nstock.name, nse_traded=True, nse_start_date=nstart_date, )

对于只有bse_traded=True-

ins = t.insert().values(security_isin=bstock.isin, company_name=bstock.name, bse_traded=True, bse_start_date=bstart_date)

对应于nse_traded=True和{}

我想大量插入这些语句。因此,像values().compile这样的带有create语句的默认值的东西将非常有用,这样我就可以使用以下命令-

conn.execute(all_scrips_info.insert() , [ {}, {} ] ) 在什么情况下,dict会根据需要使用默认值填充?在

我还研究了this问题,但这与我的要求略有不同。有一个old question on google groups与我的要求类似。但是sqlalchemy的版本比较老,加上答案不太容易理解。在

我是不是遗漏了一些很明显的东西?在


Tags: nametruedefaultdatecolumn语句allstart
1条回答
网友
1楼 · 发布于 2024-03-28 11:36:38

下面我提供一个简单的示例,说明如何使用SQLAlchemy将CSV文件中的数据插入数据库。这里的默认值是创建日期。在init函数中,您可以添加更多的逻辑。。。创建对象时应用此逻辑。在

我想指出的是,还有其他方法。例如,请参阅SQLAlchemy文档:http://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations

示例:

import csv
from io import StringIO
from sqlalchemy import Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from datetime import datetime

# Setting up model

Base = declarative_base()


class Car(Base):
    __tablename__ = 'car'

    id = Column('id', Integer, primary_key=True)
    created = Column('created', DateTime, default=datetime.now())
    brand = Column(String(250))
    nr_gears = Column('nr_gears', Integer)

    def __init__(self, brand, nr_gears):
        self.brand = brand
        self.nr_gears = nr_gears

        # You can place logic,conditions here when creating the objects. Now only use of default date - creation

    def __repr__(self):
        return '{created}\t{brand} (nr of gears: {nr_gears})'.format(
            created=datetime.strftime(self.created, '%d/%m/%Y'), brand=self.brand, nr_gears=self.nr_gears)


engine = create_engine('sqlite:///')
session = sessionmaker()
session.configure(bind=engine)
ex_ses = session()
Base.metadata.create_all(engine)

# Reading in some dummy data

csv_data = \
    '''Audi,5
    BMW,5
    Mercedes-Benz,5
    Opel,5
    Porsche,6
    Volkswagen,5
    Acura,5
    Datsun,6
    Honda,6
    Infiniti,5
    Isuzu,6
    Lexus,5
    Mazda,5
    Mitsubishi,5
    Nissan,5
    Suzuki,6
    Toyota,6
    Subaru,6'''

with StringIO(csv_data) as car_csv:
    cars_data = []
    readCSV = csv.reader(car_csv, delimiter=',')
    for row in readCSV:
        # Add data to the session.
        ex_ses.add(Car(brand=row[0], nr_gears=row[1]))

ex_ses.commit()

# Query
cars = (ex_ses.query(Car).all())
print('Created\t\tBrand (nr of gears)')
print('-' * 45)
for car in cars:
    print(car)

# output:
'''
Created     Brand (nr of gears)
                      -
18/07/2017  Audi (nr of gears: 5)
18/07/2017  BMW (nr of gears: 5)
18/07/2017  Mercedes-Benz (nr of gears: 5)
18/07/2017  Opel (nr of gears: 5)
18/07/2017  Porsche (nr of gears: 6)
18/07/2017  Volkswagen (nr of gears: 5)
18/07/2017  Acura (nr of gears: 5)
18/07/2017  Datsun (nr of gears: 6)
18/07/2017  Honda (nr of gears: 6)
18/07/2017  Infiniti (nr of gears: 5)
18/07/2017  Isuzu (nr of gears: 6)
18/07/2017  Lexus (nr of gears: 5)
18/07/2017  Mazda (nr of gears: 5)
18/07/2017  Mitsubishi (nr of gears: 5)
18/07/2017  Nissan (nr of gears: 5)
18/07/2017  Suzuki (nr of gears: 6)
18/07/2017  Toyota (nr of gears: 6)
18/07/2017  Subaru (nr of gears: 6)
'''

希望这有帮助。在

编辑:根据评论,我扩展了下面的汽车类。如果齿轮数丢失。。。使用默认值9。这当然是一个有限的例子,但是(我希望)展示了使用默认值的可能性

^{pr2}$

相关问题 更多 >