Python操作数据库基本操作-sqlalchemy

使用sqlalchemy,不仅要安装sqlalchemy库,还要安装pymysql

连接数据库很简单,使用一行简短的程序即可

from sqlalchemy import create_engine
import pandas as pd


def sqlalchemy_test():
    ENGINE = create_engine("mysql+pymysql://root:zksmysql@127.0.0.1:3306/asoul")
    # 查询2021年9月30日之后的所有item
    sql = """
        select iditem,itemname,performtime from item where performtime>'2021-9-30'
        order by performtime desc
        """
    df = pd.read_sql(sql, ENGINE)
    print(df)


if __name__ == '__main__':
    sqlalchemy_test()

然后就查询成功,打印数据框,也可以换成自己的查询语句进行数据库连接测试。

 

关键的是插入数据,这里有如下的数据表

一个int类型自增主键,一个DATETIME类型的日期,其他四个String类型

有如下数据:

 该数据有三列,分别对应category、itemname、performtime,其中performtime有一些空字段。

现在目标是将一下数据插入到上述表item中。

 

首先,在python文件中定义表Item的映射(创建表):格式如下

from sqlalchemy import create_engine
from sqlalchemy import Column
from sqlalchemy import Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_bas
import pandas as pd

Base = declarative_base()


class Item(Base):
    __tablename__ = 'item'
    iditem = Column(Integer, primary_key=True)
    category = Column(String(32))
    itemname = Column(String(64))
    idolname = Column(String(16))
    performtime = Column(DateTime)
    linkurl = Column(String(128))

    def __repr__(self):
        return "<Item(category='%s', itemname='%s', idolname='%s', performtime='%s)>" % \
               self.category, self.itemname, self.idolname, self.performtime

一、插入单条数据

建立数据库连接,根据连接初始化Session的参数,然后创建session对象,用session来进行数据记录的插入,最后提交此次操作:

from sqlalchemy import create_engine
from sqlalchemy import Column
from sqlalchemy import Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import pandas as pd

Base = declarative_base()


class Item(Base):
    __tablename__ = 'item'
    iditem = Column(Integer, primary_key=True)
    category = Column(String(32))
    itemname = Column(String(64))
    idolname = Column(String(16))
    performtime = Column(DateTime)
    linkurl = Column(String(128))def insert_into_table():
    ENGINE = create_engine("mysql+pymysql://root:zksmysql@127.0.0.1:3306/asoul")
    Base.metadata.create_all(ENGINE)
    Session = sessionmaker(bind=ENGINE)
    session = Session()
    session.add(Item(category="", itemname="胡广生", idolname="珈乐Carol", performtime=None))
    session.add(Item(category="", itemname="七里香", idolname="珈乐Carol", performtime="2021-2-14"))
    session.commit()


if __name__ == '__main__':
    insert_into_table()

这里插入的两条记录,

1. 缺省了自增主键,这个会根据数据库的自增主键字段,自动设置主键

2. 缺省了linkurl字段,这个会在数据库自动设置为NULL

3. 其中一条记录的performtime字段设置为None,这个会自动在数据库设置为NULL

结果如下:

 

二、批量插入记录 

读取文件,将每一行数据创建为一个Item对象。然后调用session的add_all函数一次性全部插入数据库,对于空字段需要进行判断

from sqlalchemy import create_engine
from sqlalchemy import Column
from sqlalchemy import Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()


class Item(Base):
    __tablename__ = 'item'
    iditem = Column(Integer, primary_key=True)
    category = Column(String(32))
    itemname = Column(String(64))
    idolname = Column(String(16))
    performtime = Column(DateTime)
    linkurl = Column(String(128))


def insert_into_table():
    # 将数据的每一行创建为一个Item对象
    data = []
    with open("temp.csv", encoding='utf-8') as file:
        line = file.readline()
        while line:
            line_s = line.strip("\n").split(',')
            if line_s[2] == '':
                data.append(Item(category=line_s[0], itemname=line_s[1], idolname="珈乐Carol"))
            else:
                data.append(Item(category=line_s[0], itemname=line_s[1], idolname="珈乐Carol", performtime=line_s[2]))
            line = file.readline()

    # 建立连接,创建session,提交数据
    ENGINE = create_engine("mysql+pymysql://root:zksmysql@127.0.0.1:3306/asoul")
    Base.metadata.create_all(ENGINE)
    Session = sessionmaker(bind=ENGINE)
    session = Session()
    session.add_all(data)
    session.commit()


if __name__ == '__main__':
    insert_into_table()

结果如下:

posted @ 2021-10-10 19:40  倦鸟已归时  阅读(477)  评论(0编辑  收藏  举报