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()
结果如下: