Python数据库编程
Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的数据库,你可以选择适合你项目的数据库。不同的数据库你需要下载不同的DBAPI模块,例如你需要访问Oracle数据库和MySQL数据库,你就需要下载Oracle和MySQL各自对应的python数据库模块。
DB-API是一个规范,它定义了一系列必须的对象和数据库存取方式,以便为各种各样的底层数据库系统和多种多样的数据库接口程序提供一致的访问接口。Python的DB-API为大多数的数据库实现了接口,使用它连接各数据库后,就可以用相同的方式操作各数据库。
PythonDB-API使用流程:
引入API模块。获取与数据库的连接。执行SQL语句和存储过程。关闭数据库连接。
MySQL数据库
MySQL驱动
由于MySQL服务器以独立的进程运行,并通过网络对外服务,需要支持Python的MySQL驱动来连接到MySQL服务器。python想要使用MySQL,有以下两个驱动可以使用:mysql-connector,MySQL官方提供的python驱动pymysql,Pythonx版本中用于连接MySQL服务器的一个库,Python2中则用mysqldb
开发过程中,选择任一个都可以。使用驱动之前,需要先安装,可以通过pipinstall命令来进行安装。
创建数据库连接
Connection对象
用于建立与数据库的连接创建对象:调用connect()方法
conn=connect(参数列表)
参数host:连接的mysql主机,如果本机是’localhost’参数port:连接的mysql主机的端口,默认是3306参数db:数据库的名称参数user:连接的用户名参数password:连接的密码参数charset:通信采用的编码方式,要求与数据库创建时指定的编码一致,否则中文会乱码
connection对象的方法
close(),关闭数据库连接commit(),提交事务,对数据库做出的修改需要提交才会生效rollback(),回滚事务,放弃之前的操作cursor(),返回Cursor对象,用于执行sql语句并获得结果
Cursor对象
执行sql语句创建对象:调用Connection对象的cursor()方法
cursor1=concursor()cursor对象的方法
close(),关闭游标execute(operation[,parameters]),执行语句,返回受影响的行数fetchone(),执行查询语句时,获取查询结果集的第一个行数据,返回一个元组next(),执行查询语句时,获取当前行的下一行fetchall(),执行查询时,获取结果集的所有行,一行构成一个元组,再将这些元组装入一个元组返回scroll(value[,mode]),将行指针移动到某个位置mode表示移动的方式mode的默认值为relative,表示基于当前行移动到value,value为正则向下移动,value为负则向上移动mode的值为absolute,表示基于第一条数据的位置,第一条数据的位置为0
cursor对象的属性
rowcount,只读属性,表示最近一次execute()执行后受影响的行数connection,获得当前连接对象
常用操作举例
创建数据库创建数据库使用“CREATEDATABASE”语句,以下创建一个名为runoob_db的数据库:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect( host='localhost', user='root', passwd='123456' )
mycursor = mydb.cursor() #创建游标
mycursor.execute('CREATE DATABASE test_db')
创建数据库前我们也可以使用“SHOWDATABASES”语句来查看数据库是否存在:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect( host='localhost', user='root', passwd='123456' )
mycursor = mydb.cursor()
mycursor.execute('SHOW DATABASES')
for x in mycursor:
print(x)
或者我们可以直接连接数据库,如果数据库不存在,会输出错误信息:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db' )
数据表操作
创建数据表
创建数据表使用“CREATETABLE”语句,创建数据表前,需要确保数据库已存在,以下创建一个名为sites的数据表:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('CREATE TABLE sites (name VARCHAR(255), url VARCHAR(255))')
执行成功后,我们可以看到数据库创建的数据表sites,字段为name和url。
我们也可以使用“SHOWTABLES”语句来查看数据表是否已存在:
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('SHOW TABLES')
for x in mycursor:
print(x)
主键设置
创建表的时候我们一般都会设置一个主键,我们可以使用'INTAUTO_INCREMENTPRIMARYKEY'语句来创建一个主键,主键起始值为逐步递增。
如果我们的表已经创建,我们需要使用ALTERTABLE来给表添加主键:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('ALTER TABLE sites ADD COLUMN id INT AUTO_INCREMENT PRIMARY KEY')
如果你还未创建sites表,可以直接使用以下代码创建。
demo_mysql_test.py:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('CREATE TABLE sites (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), url VARCHAR(255))')
插入数据
插入数据使用“INSERTINTO”语句:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'INSERT INTO sites (name, url) VALUES (%s, %s)'
val = ('RUNOOB', 'https://www.runoob.com')
mycursor.execute(sql, val)
mydb.commit() # 数据表内容有更新,必须使用到该语句
print(mycursor.rowcount, '记录插入成功。')
批量插入
批量插入使用executemany()方法,该方法的第二个参数是一个元组列表,包含了我们要插入的数据:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'INSERT INTO sites (name, url) VALUES (%s, %s)'
val = [ ('Google', 'https://www.google.com'), ('Github', 'https://www.github.com'), ('Taobao','https://www.taobao.com'), ('stackoverflow', 'https://www.stackoverflow.com/') ]
mycursor.executemany(sql, val)
mydb.commit() # 数据表内容有更新,必须使用到该语句
print(mycursor.rowcount, '记录插入成功。')
如果我们想在数据记录插入后,获取该记录的ID,可以使用以下代码:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'INSERT INTO sites (name, url) VALUES (%s, %s)'
val = ('Zhihu', 'https://www.zhihu.com')
mycursor.execute(sql, val)
mydb.commit()
print('1 条记录已插入, ID:', mycursor.lastrowid)
查询数据
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('SELECT * FROM sites')
myresult = mycursor.fetchall() # fetchall() 获取所有记录
for x in myresult:
print(x)
也可以读取指定的字段数据:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('SELECT name, url FROM sites')
myresult = mycursor.fetchall()
for x in myresult:
print(x)
如果我们只想读取一条数据,可以使用fetchone()方法:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('SELECT * FROM sites')
myresult = mycursor.fetchone()
print(myresult)
where条件语句
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'SELECT * FROM sites WHERE name ='RUNOOB''
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
也可以使用通配符%:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'SELECT * FROM sites WHERE url LIKE '%oo%''
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
排序
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'SELECT * FROM sites ORDER BY name'
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('SELECT * FROM sites LIMIT 3')
myresult = mycursor.fetchall()
for x in myresult:
print(x)
也可以指定起始位置,使用的关键字是OFFSET:
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
mycursor.execute('SELECT * FROM sites LIMIT 3 OFFSET 1') # 0 为 第一条,1 为第二条,以此类推
myresult = mycursor.fetchall()
for x in myresult:
print(x)
删除记录
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'DELETE FROM sites WHERE name = 'stackoverflow''
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, ' 条记录删除')
注意:要慎重使用删除语句,删除语句要确保指定了WHERE条件语句,否则会导致整表数据被删除。
更新表数据
import mysql.connector
mydb = mysql.connector.connect(host='localhost',user='root',passwd='123456',database='test_db')
mycursor = mydb.cursor()
sql = 'UPDATE sites SET name = 'ZH' WHERE name = 'Zhihu''
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, ' 条记录被修改')
注意:UPDATE语句要确保指定了WHERE条件语句,否则会导致整表数据被更新。
删除表
文章为作者独立观点,不代表股票量化交易软件接口观点
Cicero2023-01-10
确实没必要推荐股票,搞不就成仇人了,每个人的情况都不一样,就算走上坡的股票也不见得每个人都能盈利望远镜2022-10-01
现在告诉你有一个行业同时满足三个条件:行业正处在龙头迅速抢占市场份额的时期;由于很多激进竞争者退出市场,唯一的原材料价格逐渐走低;政府鼓励;这个行业如果换成其他任何行业,机构股票肯定趋之若鹜,但当他们知道这个行业是房地产时,怎么就敬而远之了呢?这真是一个神奇的现象。海阔天高2022-08-05
看曲线兄台非常稳定的亏钱,高人!跟我一时瑜亮,有种惺惺相惜的感觉,但是小弟这线有些起伏,大趋势是类似的。股票伤我千百遍,我待大A如初恋。欧阳西子2022-07-21
好股都要经过千练万摸。最终赚钱的人少,亏本的人多,大部分的人乱卖乱买。股票是一个艰难的事情,在好跟他说不相信。没有用,今天开盘还没有涨。看后面会不会啦一下。〖财水人直】2022-06-24
关注道哥就是因为航发和沈飞,当时每天晚上不看看道哥的分析就睡不着觉,后来道哥说了航发的腰斩结论之后,我虽然心存疑惑,但是还是减仓了,后面道哥不分析军工了,我有一段时间就看道哥的少了,再后面跌的我也把沈飞和航发清仓了。然后又来看道哥,发现道哥开始做股票了,然后我也开始研究股票,又跟上了道哥的步伐。前两天看见航发大涨了,我还私信问道哥对军工的看法