Python MySQLdb - class 中的连接
Python MySQLdb - Connection in a class
我正在制作一个 Python 项目,我必须在其中从数据库中查找和检索数据。
我尝试制作一个 class,我在其中声明连接并进行查询,这就是我目前所拥有的。
import MySQLdb
dbc =("localhost","root","1234","users")
class sql:
db = MySQLdb.connect(dbc[0],dbc[1],dbc[2],dbc[3])
cursor = db.cursor()
def query(self,sql):
sql.cursor.execute(sql)
return sql.cursor.fetchone()
def rows(self):
return sql.cursor.rowcount
sqlI = sql()
print(sqlI.query("SELECT `current_points` FROM `users` WHERE `nick` = 'username';"))
所以,主要问题是变量 db
和 cursor
不能从同一个 Class 的其他 def's/functions 调用。我想要得到的是一个完善的查询,我可以在其中进行查询并检索其内容。这将总结我的代码,因此我应该这样做。
Python 中的 类 可不是这样写的。您需要在 __init__
方法中定义您的连接和光标,并通过 self
.
引用它们
class sql:
dbc = ("localhost","root","1234","users")
def __init__(self):
db = MySQLdb.connect(*self.dbc)
self.cursor = db.cursor()
def query(self,sql):
self.cursor.execute(sql)
return self.cursor.fetchone()
def rows(self):
return self.cursor.rowcount
我通常使用psycopg2 / postgres,但这是我经常使用的基础数据库class,以Python的SQLite为例:
import sqlite3
class Database:
def __init__(self, name):
self._conn = sqlite3.connect(name)
self._cursor = self._conn.cursor()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
@property
def connection(self):
return self._conn
@property
def cursor(self):
return self._cursor
def commit(self):
self.connection.commit()
def close(self, commit=True):
if commit:
self.commit()
self.connection.close()
def execute(self, sql, params=None):
self.cursor.execute(sql, params or ())
def fetchall(self):
return self.cursor.fetchall()
def fetchone(self):
return self.cursor.fetchone()
def query(self, sql, params=None):
self.cursor.execute(sql, params or ())
return self.fetchall()
这将使您可以像 db = Database('db_file.sqlite)
一样正常使用 Database
class 或在 with
语句中使用:
with Database('db_file.sqlite') as db:
# do stuff
当 with
语句退出时,连接将自动提交并关闭。
然后,您可以将您经常执行的特定查询封装在方法中,并使其易于访问。例如,如果你正在处理交易记录,你可以有一个方法来按日期获取它们:
def transactions_by_date(self, date):
sql = "SELECT * FROM transactions WHERE transaction_date = ?"
return self.query(sql, (date,))
下面是一些示例代码,我们在其中创建 table、添加一些数据,然后将其读回:
with Database('my_db.sqlite') as db:
db.execute('CREATE TABLE comments(pkey INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR, comment_body VARCHAR, date_posted TIMESTAMP)')
db.execute('INSERT INTO comments (username, comment_body, date_posted) VALUES (?, ?, current_date)', ('tom', 'this is a comment'))
comments = db.query('SELECT * FROM comments')
print(comments)
希望对您有所帮助!
您可以使用构造函数进行连接。当 class 的对象创建时,构造函数将自动调用。
import MySQLdb
class Connection:
def __init__(self):
self.con=MySQLdb.connect("127.0.0.1","root","","db_name",3306)
self.cmd=self.con.cursor()
obj=Connection()
from config import Config
import MySQLdb
class Connection:
def __init__(self):
self.db=MySQLdb.connect(
Config.DATABASE_CONFIG['server'],
Config.DATABASE_CONFIG['user'],
Config.DATABASE_CONFIG['password'],
Config.DATABASE_CONFIG['name']
)
self.db.autocommit(True)
self.db.set_character_set('utf8mb4')
self.cur=self.db.cursor()
示例配置 CLASS(config.py):
class Config(object):
DATABASE_CONFIG = {
'server': 'localhost',
'user': 'dbuser',
'password': 'password',
'name': 'dbname',
}
我正在制作一个 Python 项目,我必须在其中从数据库中查找和检索数据。
我尝试制作一个 class,我在其中声明连接并进行查询,这就是我目前所拥有的。
import MySQLdb
dbc =("localhost","root","1234","users")
class sql:
db = MySQLdb.connect(dbc[0],dbc[1],dbc[2],dbc[3])
cursor = db.cursor()
def query(self,sql):
sql.cursor.execute(sql)
return sql.cursor.fetchone()
def rows(self):
return sql.cursor.rowcount
sqlI = sql()
print(sqlI.query("SELECT `current_points` FROM `users` WHERE `nick` = 'username';"))
所以,主要问题是变量 db
和 cursor
不能从同一个 Class 的其他 def's/functions 调用。我想要得到的是一个完善的查询,我可以在其中进行查询并检索其内容。这将总结我的代码,因此我应该这样做。
Python 中的 类 可不是这样写的。您需要在 __init__
方法中定义您的连接和光标,并通过 self
.
class sql:
dbc = ("localhost","root","1234","users")
def __init__(self):
db = MySQLdb.connect(*self.dbc)
self.cursor = db.cursor()
def query(self,sql):
self.cursor.execute(sql)
return self.cursor.fetchone()
def rows(self):
return self.cursor.rowcount
我通常使用psycopg2 / postgres,但这是我经常使用的基础数据库class,以Python的SQLite为例:
import sqlite3
class Database:
def __init__(self, name):
self._conn = sqlite3.connect(name)
self._cursor = self._conn.cursor()
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
@property
def connection(self):
return self._conn
@property
def cursor(self):
return self._cursor
def commit(self):
self.connection.commit()
def close(self, commit=True):
if commit:
self.commit()
self.connection.close()
def execute(self, sql, params=None):
self.cursor.execute(sql, params or ())
def fetchall(self):
return self.cursor.fetchall()
def fetchone(self):
return self.cursor.fetchone()
def query(self, sql, params=None):
self.cursor.execute(sql, params or ())
return self.fetchall()
这将使您可以像 db = Database('db_file.sqlite)
一样正常使用 Database
class 或在 with
语句中使用:
with Database('db_file.sqlite') as db:
# do stuff
当 with
语句退出时,连接将自动提交并关闭。
然后,您可以将您经常执行的特定查询封装在方法中,并使其易于访问。例如,如果你正在处理交易记录,你可以有一个方法来按日期获取它们:
def transactions_by_date(self, date):
sql = "SELECT * FROM transactions WHERE transaction_date = ?"
return self.query(sql, (date,))
下面是一些示例代码,我们在其中创建 table、添加一些数据,然后将其读回:
with Database('my_db.sqlite') as db:
db.execute('CREATE TABLE comments(pkey INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR, comment_body VARCHAR, date_posted TIMESTAMP)')
db.execute('INSERT INTO comments (username, comment_body, date_posted) VALUES (?, ?, current_date)', ('tom', 'this is a comment'))
comments = db.query('SELECT * FROM comments')
print(comments)
希望对您有所帮助!
您可以使用构造函数进行连接。当 class 的对象创建时,构造函数将自动调用。
import MySQLdb
class Connection:
def __init__(self):
self.con=MySQLdb.connect("127.0.0.1","root","","db_name",3306)
self.cmd=self.con.cursor()
obj=Connection()
from config import Config
import MySQLdb
class Connection:
def __init__(self):
self.db=MySQLdb.connect(
Config.DATABASE_CONFIG['server'],
Config.DATABASE_CONFIG['user'],
Config.DATABASE_CONFIG['password'],
Config.DATABASE_CONFIG['name']
)
self.db.autocommit(True)
self.db.set_character_set('utf8mb4')
self.cur=self.db.cursor()
示例配置 CLASS(config.py):
class Config(object):
DATABASE_CONFIG = {
'server': 'localhost',
'user': 'dbuser',
'password': 'password',
'name': 'dbname',
}