游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

后端编程Python3数据库编程

  对大多数软件开发者而言,术语数据库通常是指RDBMS(关系数据库管理系统),这些系统使用表格(类似于电子表格的网格),其中行表示记录,列表示记录的字段。表格及其中存放的数据是使用SQL(结构化査询语言)编写的语句来创建并操纵的。Python提供了用于操纵SQL数据库的API(应用程序接口),通常与作为标准的SQLite3数据库一起发布。
  另一种数据库是DBM(数据库管理器),其中存放任意数量的键值项。Python的标准库提供了几种DBM的接口,包括某些特定于UNIX平台的。DBM的工作方式与Python中的字典类似,区别在于DBM通常存放于磁盘上而不是内存中,并且其键与值总是bytes对象,并可能受到长度限制。本章第一节中讲解的shelve模块提供了方便的DBM接口,允许我们使用字符串作为键,使用任意(picklable)对象作为值。
  如果可用的DBM与SQLite数据库不够充分,PythonPackageIndex,pypi。python。orgpypi中提供了大量数据库相关的包,包括bsddbDBM(BerkeleyDB),对象关系映射器,比如SQLAlchemy(www。sqlalchemy。org),以及流行的客户端服务器数据的接口,比如DB2、Informix、Ingres、MySQL、ODBC以及PostgreSQL。
  本章中,我们将实现某程序的两个版本,该程序用于维护一个DVD列表,并追踪每个DVD的标题、发行年份、时间长度以及发行者。该程序的第一版使用DBM(通过shelve模块)存放其数据,第二版则使用SQLite数据库。两个程序都可以加载与保存简单的XML格式,这使得从某个程序导出DVD数据并将其导入到其他程序成为可能。与DBM版相比,基于SQL的程序提供了更多一些的功能,并且其数据设计也稍干净一些。
  12。1DBM数据库
  shelve模块为DBM提供了一个wrapper,借助于此,我们在与DBM交互时,可以将其看做一个字典,这里是假定我们只使用字符串键与picklable值,实际处理时,shelve模块会将键与值转换为bytes对象(或者反过来)。
  由于shelve模块使用的是底层的DBM,因此,如果其他计算机上没有同样的DBM,那么在某台计算机上保存的DBM文件在其他机器上无法读取是可能的。为解决这一问题,常见的解决方案是对那些必须在机器之间可传输的文件提供XML导入与导出功能,这也是我们在本节的DVD程序dvdsdbm。py中所做的。
  对键,我们使用DVD的标题;对值,则使用元组,其中存放发行者、发行年份以及时间。借助于shelve模块,我们不需要进行任何数据转换,并可以把DBM对象当做一个字典进行处理。
  程序在结构上类似于我们前面看到的那种菜单驱动型的程序,因此,这里主要展示的是与DBM程序设计相关的那部分。下面给出的是程序main()函数中的一部分,忽略了其中菜单处理的部分代码。
  dbNone
  try:
  dbshelve。open(filename,protocolpickle。HIGHESTPROTOCOL)
  finally:
  ifdbisnotNone:
  db。dose()
  这里我们已打开(如果不存在就创建)指定的DBM文件,以便于对其进行读写操作。每一项的值使用指定的pickle协议保存为一个pickle,现有的项可以被读取,即便是使用更底层的协议保存的,因为Python可以计算出用于读取pickle的正确协议。最后,DBM被关闭其作用是清除DBM的内部缓存,并确保磁盘文件可以反映出已作的任何改变,此外,文件也需要关闭。
  该程序提供了用于添加、编辑、列出、移除、导入、导出DVD数据的相应选项。除添加外,我们将忽略大部分用户接口代码,同样是因为已经在其他上下文中进行了展示。
  defadddvd(db):
  titleConsole。getstring(Title,title)
  ifnottitle:
  return
  directorConsole。getstring(Director,director)
  ifnotdirector:
  return
  yearConsole。getinteger(Year,year,minimum1896,
  maximumdatetime,date。today()。year)
  durationConsole。getinteger(Duration(minutes),minutes,minimum0,maximum6048)
  db〔title〕(director,year,duration)
  db。sync()
  像程序菜单调用的所有函数一样,这一函数也以DBM对象(db)作为其唯一参数。该函数的大部分工作都是获取DVD的详细资料,在倒数第二行,我们将键值项存储在DBM文件中,DVD的标题作为键,发行者、年份以及时间(由shelve模块pickled在一起)作为值。
  为与Python通常的一致性同步,DBM提供了与字典一样的API,因此,除了shelve。open()函数(前面已展示)与shelve。Shelf。sync()方法(该方法用于清除shelve的内部缓存,并对磁盘上文件的数据与所做的改变进行同步这里就是添加一个新项),我们不需要学习任何新语法。
  defeditdvd(db):
  oldtitlefinddvd(db,edit)
  ifoldtitleisNone:
  return
  titleConsole。get。string(Title,title,oldtitle)
  ifnottitle:
  return
  director,year,durationdb〔oldtitle〕
  。。。
  db〔title〕(director,year,duration)
  iftitle!oldtitle:
  deldb〔oldtitle〕
  db。sync()
  为对某个DVD进行编辑,用户必须首先选择要操作的DVD,也就是获取DVD的标题,因为标题用作键,值则用于存放其他相关数据。由于必要的功能在其他场合(比如移除DVD)也需要使用,因此我们将其实现在一个单独的finddvd()函数中,稍后将査看该函数。如果找到了该DVD,我们就获取用户所做的改变,并使用现有值作为默认值,以便提高交互的速度。(对于这一函数,我们忽略了大部分用户接口代码,因为其与添加DVD时几乎是相同的。)最后,我们保存数据,就像添加时所做的一样。如果标题未作改变,就重写相关联的值;如果标题已改变,就创建一个新的键值对,并且需要删除原始项。
  deffinddvd(db,message):
  message(Startof)titletomessage
  whileTrue:
  matches〔〕
  startConsole。getstring(message,title)
  ifnotstart:
  returnNone
  fortitleindb:
  iftitle。lower()。startswith(start。lower()):
  matches。append(title)
  iflen(matches)0:
  print(Therearenodvdsstartingwith,start)
  continue
  eliflen(matches)1:
  returnmatches〔0〕
  eliflen(matches)DISPLAYLIMIT:
  print(Toomanydvdsstartwith{0};tryenteringmoreofthetitle。format(start)
  continue
  else:
  matchessorted(matches,keystr。lower)
  fori,matchinenumerate(matches):
  print({0}:{1}。format(i1,match))
  whichConsole。getinteger(Number(or0tocancel),
  number,minimum1,maximumlen(matches))
  returnmatches〔which1〕ifwhich!0elseNone
  为尽可能快而容易地发现某个DVD,我们需要用户只输入其标题的一个或头几个字符。在具备了标题的起始字符后,我们在DBM中迭代并创建一个匹配列表。如果只有一个匹配项,就返回该项;如果有几个匹配项(但少于DISPLAYLIMIT,一个在程序中其他地方设置的整数),就以大小写不敏感的顺序展示所有这些匹配项,并为每一项设置一个编号,以便用户可以只输入编号就可以选择某个标题。(Console。getinteger()函数可以接受0,即便最小值大于0,以便0可以用作一个删除值。通过使用参数allowzeroFalse,可以禁止这种行为。我们不能使用Enter键,也就是说,没有什么意味着取消,因为什么也不输入意味着接受默认值。)
  deflistdvds(db):
  start
  iflen(db)DISPLAY。LIMIT:
  startConsole。getstring(Listthosestartingwith〔Enterall〕,start)
  print()
  fortitleinsorted(db,keystr。lower):
  ifnotstartortitle。Iower()。startswith(start。lower()):
  director,year,durationdb〔title〕
  print({title}({year}){duration}minute{0},by
  {director}。format(Util。s(duration),locals()))
  列出所有DVD(或者那些标题以某个子字符串引导)就是对DBM的所有项进行迭代。
  Util。s()函数就是简单的slambdax:ifx1elses,因此,如果时间长度不是1分钟,就返回s。
  defremovedvd(db):
  titlefinddvd(db,remove)
  iftitleisNone:
  return
  ansConsole。getbool(Remove{0}?。format(title),no)
  ifans:
  deldb〔title〕
  db。sync()
  要移除一个DVD,首先需要找到用户要移除的DVD,并请求确认,获取后从DBM中删除该项即可。
  到这里,我们展示了如何使用shelve模块打开(或创建)一个DBM文件,以及如何向其中添加项、编辑项、对其项进行迭代以及移除某个项。
  遗憾的是,在我们的数据设计中存在一个瑕疵。发行者名称是重复的,这很容易导致不一致性,比如,发行者DannyDeVito可能被输入为DannyDeVito,用于一个电影;也可以输入为DannydeVito,用于另一个。为解决这一问题,可以使用两个DBM文件,主DVD文件使用标题键与(年份,时间长度,发行者ID)值;发行者文件使用发行者ID(整数)键与发行者名称值。下一节展示的SQL数据库版程序将避免这一瑕疵,这是通过使用两个表格实现的,一个用于DVD,另一个用于发行者。
  12。2SQL数据库
  大多数流行的SQL数据库的接口在第三方模块中是可用的,Python带有sqlite3模块(以及SQLite3数据库),因此,在Python中,可以直接开始数据库程序设计。SQLite是一个轻量级的SQL数据库,缺少很多诸如PostgreSQL这种数据库的功能,但非常便于构造原型系统,并且在很多情况下也是够用的。
  为使后台数据库之间的切换尽可能容易,PEP249(PythonDatabaseAPISpecificationv2。0)提供了称为DBAPI2。0的API规范。数据库接口应该遵循这一规范,比如sqlite3模块就遵循这一规范,但不是所有第三方模块都遵循。API规范中指定了两种主要的对象,即连接对象与游标对象。表121与表122中分别列出了这两种对象必须支持的API。在sqlite3模块中,除DBAPI2。0规范必需的之外,其连接对象与游标对象都提供了很多附加的属性与方法。
  表121DBAPI2。0连接对象方法
  语法
  描述
  db。close()
  关闭到数据库(由db对象表示,通过调用connect()函数获取)的连接
  db。commit()
  向数据库中提交任何未解决的事务,对不支持事务的数据库则不进行任何操作
  db。cursor()
  返回一个数据库游标对象,可用于执行数据库査询
  db。rolIback()
  将任何尚未完成的事务回滚到事务开始前的状态,对不支持事务的数据库则不进行任何操作
  表122
  DBAPI2。0游标对象属性与方法
  语法
  描述
  c。arraysize
  fetchmany()将返回的(可读的可写的)行数(如果没有指定大小)
  c。close()
  关闭游标C,在游标超出范围之外时会自动执行这一操作
  c。description
  一个只读的7元组(name,typecode,displaysize,internalsize,precision,scale,nullok)序列,描述了每个相继曲游标c组成的列
  c。execute(sql,params)
  执行字符串sql表示的SQL查询,使用相应的参数(如果给定就来自params序列或映射)替代每个占位符
  c。executemany(sql,seqofparams)
  对序列或映射中的seqofparams序列中的每一项执行一次SQL查询,该方法不应该用于创建结果集的操作(比如SELECT语句)
  c。fetchall()
  返回一个序列,其中包含所有尚未取回的行
  c。fetchmany(size)
  返回一个行序列(每个行本身也是一个序列),size默认值为c。arraysize
  c。fetchone()
  以序列的形式返回査询结果集的下一行,结果用尽后则返回None,如果没有结果集就产生一个异常
  c。rowcount
  最后一个操作(比如SELECT、INSERT、UPDATE或DELETE)的只读的行计数,如果不可用或不能应用,就返回1
  DVD程序的SQL版本为dvds。sql。py,该程序将发行者与DVD数据分开存储,以避免重复,并提供一个新菜单,以供用户列出发行者。该程序使用的两个表格在图121
  defconnect(filename):
  createnotos。path。exists(filename)
  dbsqlite3。connect(filename)
  ifcreate:
  cursordb。cursor()
  cursor。execute(CREATETABLEdirectors(
  idINTEGERPRIMARYKEYAUTOINCREMENTUNIQUENOTNULL,
  nameTEXTUNIQUENOTNULL))
  cursor。execute(CREATETABLEdvds(
  idINTEGERPRIMARYKEYAUTOINCREMENTUNIQUENOTNULL,
  titleTEXTNOTNULL,
  yearINTEGERNOTNULL,
  durationINTEGERNOTNULL,
  directoridINTEGERNOTNULL,
  FOREIGNKEY(directorid)REFERENCESdirectors))
  db。commit()
  returndb
  sqlite3。connect()函数会返回一个数据库对象,并打开其指定的数据库文件。如果该文件不存在,就创建一个空的数据库文件。鉴于此,在调用sqlite3。connect()之前,我们要注意数据库是否是准备从头开始创建,如果是,就必须创建该程序要使用的表格。所有査询都是通过一个数据库游标完成的,可以从数据库对象的cursor()方法获取。
  注意,两个表格都是使用一个ID字段创建的,ID字段有一个AUTOINCREMENT约束这意味着SQLite会自动为ID字段赋予唯一性的数值,因此,在插入新记录时,我们可以将这些字段留给SQLite处理。
  SQLite支持有限的数据类型实际上就是布尔型、数值型与字符串但使用数据‘适配器可以对其进行扩展,或者是扩展到预定义的数据类型(比如那些用于日期与datetimes的类型),或者是用于表示任意数据类型的自定义类型。DVD程序并不需要这一功能,如果需要,sqlite3模块的文档提供了很多详细解释。我们使用的外部键语法可能与用于其他数据库的语法不同,并且在任何情况下,只是记录我们的意图,因为SQLite不像很多其他数据库那样需要强制关系完整性,sqlite3另一点与众不同的地方在于其默认行为是支持隐式的事务处理,因此,没有提供显式的开始事务方法。
  defadddvd(db):
  titleConsole。getstring(Title,title)
  ifnottitle:
  return
  directorConsole。getstring(Director,director)
  ifnotdirector:
  return
  yearConsole。getinteger(Year,year,minimum1896,
  maximumdatetime。date。today()。year)
  durationConsole。getinteger(Duration(minutes),minutes,
  minimum0,maximum6048)
  directoridgetandsetdirector(db,director)
  cursordb。cursor()
  cursor。execute(INSERTINTOdvds
  (title,year,duration,directorid)
  VALUES(?,?,?,?),
  (title,year,duration,directorid))
  db。commit()
  这一函数的开始代码与dvdsdbm。py程序中的对应函数一样,但在完成数据的收集后,与原来的函数有很大的差别。用户输入的发行者可能在也可能不在directors表格中,因此,我们有一个getandsetdirector()函数,在数据库中尚无某个发行者时,该函数就将其插入到其中,无论哪种情况都返回就绪的发行者ID,以便在需要的时候插入到dvds表。在所有数据都可用后,我们执行一条SQLINSERT语句。我们不需要指定记录ID,因为SQLite会自动为我们提供。
  在査询中,我们使用问号(?)作为占位符,每个?都由包含SQL语句的字符串后面的序列中的值替代。命名的占位符也可以使用,后面在编辑记录时我们将看到。尽管避免使用占位符(而只是简单地使用嵌入到其中的数据来格式化SQL字符串)也是可能的,我们建议总是使用占位符,并将数据项正确编码与转义的工作留给数据库模块来完成。使用占位符的另一个好处是可以提高安全性,因为这可以防止任意的SQL被恶意地插入到一个査询中。
  defgetandsetdirector(db,director):
  directoridgetdirectorid(db,director)
  ifdirectorjdisnotNone:
  returndirectorid
  cursordb。cursor()
  cursor。execute(lNSERTINTOdirectors(name)VALUES(?),(director,))
  db。commit()
  returngetdirectorid(db,director)
  这一函数返回给定发行者的ID,并在必要的时候插入新的发行者记录。如果某个记录被插入,我们首先尝试使用getdirectorid()函数取回其ID。
  defgetdirectorid(db,director):
  cursordb。cursor()
  cursor。execute(SELECTidFROMdirectorsWHEREname?,(director,))
  fieldscursor。fetchone()
  returnfields〔0〕iffieldsisnotNoneelseNone
  getdirectorid()函数返回给定发行者的ID,如果数据库中没有指定的发行者,就返回None。我们使用fetchone()方法,因为或者有一个匹配的记录,或者没有。(我们知道,不会有重复的发行者,因为directors表格的名称字段有一个UNIQUE约束,在任何情况下,在添加一个新的发行者之前,我们总是先检査其是否存在。)这种取回方法总是返回一个字段序列(如果没有更多的记录,就返回None)。即便如此,这里我们只是请求返回一个单独的字段。
  defeditdvd(db):
  title,identityfinddvd(db,edit)
  iftitleisNone:
  return
  titleConsole。getstring(Title,title,title)
  ifnottitle:
  return
  cursordb。cursor()
  cursor。execute(SELECTdvds。year,dvds。duration,directors。name
  FROMdvds,directors
  WHEREdvds。directoriddirectors。idAND
  dvds。id:id,dict(ididentity))
  year,duration,directorcursor。fetchone()
  directorConsole。getstring(Director,director,director)
  ifnotdirector:
  return
  yearConsole,getinteger(Year,year,year,1896,datetime。date。today()。year)
  durationConsole。getinteger(Duration(minutes),minutes,
  duration,minimum0,maximum6048)
  directoridgetandsetdirector(db,director)
  cursor。execute(UPDATEdvdsSETtitle:title,year:year,
  duration:duration,directorid:directorjd
  WHEREid:identity,locals())
  db。commit()
  要编辑DVD记录,我们必须首先找到用户需要操纵的记录。如果找到了某个记录,我们就给用户修改其标题的机会,之后取回该记录的其他字段,以便将现有值作为默认值,将用户的输入工作最小化,用户只需要按Enter键就可以接受默认值。这里,我们使用了命名的占位符(形式为:name),并且必须使用映射来提供相应的值。对SELECT语句,我们使用一个新创建的字典;对UPDATE语句,我们使用的是由locals()返回的字典。
  我们可以同时为这两个语句都使用新字典,这种情况下,对UPDATE语句,我们可以传递dict(titletitle,yearyear,durationduration,directoriddirectorid,ididentity)),而非locals()。
  在具备所有字段并且用户已经输入了需要做的改变之后,我们取回相应的发行者ID(如果必要就插入新的发行者记录),之后使用新数据对数据库进行更新。我们采用了一种简化的方法,对记录的所有字段进行更新,而不仅仅是那些做了修改的字段。
  在使用DBM文件时,DVD标题被用作键,因此,如果标题进行了修改,我们就需要创建一个新的键值项,并删除原始项。不过,这里每个DVD记录都有一个唯一性的ID,该ID是记录初次插入时创建的,因此,我们只需要改变任何其他字段的值,而不需要其他操作。
  deffinddvd(db,message):
  message(Startof)titletomessage
  cursordb。cursor()
  whileTrue:。
  startConsole。getstnng(message,title)
  ifnotstart:
  return(None,None)
  cursor。execute(SELECTtitle,idFROMdvds
  WHEREtitleLIKE?ORDERBYtitle,
  (start,))
  recordscursor。fetchall()
  iflen(records)0:
  print(Therearenodvdsstartingwith,start)
  continue
  eliflen(records)1:
  returnrecords〔0〕
  eliflen(records)DISPLAYLIMIT:
  print(Toomanydvds({0})startwith{1};tryentering
  moreofthetitle。format(len(records),start))
  continue
  else:
  fori,recordinenumerate(records):
  print({0}:{1}。format(i1,record〔0〕))
  whichConsole。getinteger(Number(or0tocancel),
  number,minimum1,maximumlen(records))
  returnrecords〔which1〕ifwhich!0else(None,None)
  这一函数的功能与dvdsdbm。py程序中的finddvd()函数相同,并返回一个二元组(DVD标题,DVDID)或(None,None),具体依赖于是否找到了某个记录。这里并不需要在所有数据上进行迭代,而是使用SQL通配符(),因此只取回相关的记录。
  由于我们希望匹配的记录数较小,因此我们一次性将其都取回到序列的序列中。如果有不止一个匹配的记录,但数量上又少到可以显示,我们就打印记录,并将每条记录附带一个数字编号,以便用户可以选择需要的记录,其方式与在dvdsdbm。py程序中所做的类似:
  deflistdvds(db):
  cursordb。cursor()
  sql(SELECTdvds。title,dvds。year,dvds。duration,
  directors。nameFROMdvds,directors
  WHEREdvds。directoriddirectors。id)
  startNone
  ifdvdcount(db)DISPLAYLIMIT:
  startConsole。getstring(Listthosestartingwith〔Enterall〕,start)
  sqlANDdvds。titleLIKE?
  sqlORDERBYdvds。title
  print()
  ifstartisNone:
  cursor。execute(sql)
  else:
  cursor。execute(sql,(start,))
  forrecordincursor:
  print({0〔0〕}({0〔1〕}){0〔2〕}minutes,by{0〔3〕}。format(record))
  要列出每个DVD的详细资料,我们执行一个SELECT査询。该査询连接两个表,如果记录(由dvdcount()函数返回)数量超过了显示限制值,就将第2个元素添加到WHERE分支,之后执行该査询,并在结果上进行迭代。每个记录都是一个序列,其字段是与SELECT査询相匹配的。
  defdvdcount(db):
  cursordb。cursor()
  cursor。execute(SELECTCOUNT()FROMdvds)
  returncursor。fetchone()〔0〕
  我们将这几行代码放置在一个单独的函数中,因为我们在几个不同的函数中都需要使用这几行代码。
  我们忽略了listdirectors()函数的代码,因为该函数在结构上与listdvds()函数非常类似,只不过更简单一些,因为本函数只列出一个字段(name)。
  defremovedvd(db):
  title,identityfinddvd(db,remove)
  iftitleisNone:
  return
  ansConsole。getbool(Remove{0}?。format(title),no)
  ifans:
  cursordb。cursor()
  cursor。execute(DELETEFROMdvdsWHEREid?,(identity,))
  db。commit()
  在用户需要删除一个记录时,将调用本函数,并且本函数与dvdsdbm。py程序中相应的函数是非常类似的。
  到此,我们完全查阅了dvdssql。py程序,并且了解了如何创建数据库表格、选取记录、在选定的记录上进行迭代以及插入、更新与删除记录。使用execute()方法,我们可以执行底层数据库所支持的任意SQL语句。
  SQLite提供了比我们这里使用的多得多的功能,包括自动提交模式(以及任意其他类型的事务控制),以及创建可以在SQL查询内执行的函数的能力。提供一个工厂函数并用于控制对每个取回的记录返回什么(比如,一个字典或自定义类型,而不是字段序列)也是可能的。此外,通过传递:memory:作为文件名,创建内存中的SQLite数据库也是可能的。
  以上内容部分摘自视频课程05后端编程Python22数据库编程,更多实操示例请参照视频讲解。跟着张员外讲编程,学习更轻松,不花钱还能学习真本领。

小米公布首款四曲瀑布屏概念手机消除按键与开孔,边框几乎由屏幕IT之家2月5日消息今日下午,小米正式公布了首款四曲瀑布屏概念手机。小米表示,这款四曲瀑布屏概念手机采用四边88超曲面设计,边框几乎全部由屏幕取代。IT之家了解到,……OPPOFindX部分用户获推ColorOS11IT之家6月17日消息据IT之家网友投稿,OPPOFindX昨日开测ColorOS11,该系统基于Android11,大小为3。47GB,版本号为PAFM00PRE11H。05……一个人的坚强人到中年,有太多的束缚和无奈,曾经不敢想象的事情发生了,当年你曾设想如果是我绝对不可以委屈求全,绝对不可以让自己受委屈,但当有一天真的发生在自己身上,终于明白成年人的无奈了,只……IT之家开箱OPPOReno6图赏天玑900芯片,安卓阵营的IT之家6月7日消息OPPO上个月举行了一场海边毕业派对,正式发布了OPPOReno6系列三款新机。IT之家此前已开箱了OPPOReno6Pro和OPPOReno6Pro……滔滔湘水养育千万儿女,为何不让失魂落魄的小鸟寻找那颗孤寂的心人们平时站到昭山上,湘江像一条白丝带,当旭日东升的时候,湘江又像一条五彩的锦缎。春天,江岸上有许多野花,有红的,黄的,紫的,最引人注目的是上桃花,红得像火,红得像晚霞,倒……开往春天的列车已出发,这份自驾赏花地图请查收HELLOSPRING若待上林花似锦,出门俱是看花人又到了赏花踏青的好时节想提前get整个春日的赏花指南吗?收藏好这份《2022南川赏花地图……一加9Pro618大促3599起,256GB版减500元IT之家6月14日消息根据官方消息,一加9、9Pro两款手机将在今年的618旗舰展开优惠活动,到手价直降200500元。该系列手机于今年3月发售,搭载高通骁龙888处理器、哈苏……江苏省委常委常务副省长樊金龙江苏用三句话来回答习总书记提出的习近平总书记视察江苏时要求,江苏要在改革创新、推动高质量发展上争当表率,在服务全国构建新发展格局上争做示范,在率先实现社会主义现代化上走在前列。在国务院新闻办11月4日上午举行……一加NordCE海外发布骁龙750G64MP三摄,2328元IT之家6月10日消息今日一加在海外正式发布了OnePlusNordCE手机。这款产品搭载高通骁龙750G5G处理器,提供三种配色可选,外观简洁,摄像头突出不明显,具有3。5m……一加新手机曝光搭载天玑1200氧OS系统,目标两千元价位段IT之家6月9日消息据知名博主数码闲聊站消息,一加即将推出的新机型的工程机曝光,该手机将搭载天玑1200处理器,运行氧OS系统,该手机的定价可能会到两千元价位段,不过暂不确定是……谷歌同迈凯伦车队达成协议安卓标志将印在F1赛车引擎盖IT之家3月17日消息,科技公司和赛车队一直有着紧密的联系,谷歌和迈凯轮车队近日就达成了2022年的合作协议。作为协议的一部分,安卓标志将出现在F1赛车的引擎盖上,而Ch……谷歌Play商店更新将为Android平板电脑等大屏设备筛选IT之家3月17日消息,谷歌此前宣布将对PlayStore进行调整,帮助用户在不同尺寸的设备上更容易发现适合自己平台的应用。谷歌在最新的博客中透露,将为平板电脑等大屏设备……
邱泽婚后被问有没有请教陈意涵生孩子秘诀,无奈尴尬苦笑邱泽婚后露面,媒体的一个问题,就让他当场很尴尬了。在被问到婚后感觉怎么样,邱泽表示蛮好的、很幸福,虽然是春天,但他还是要出来辛苦干活。还大方地和大家透露当初求婚的心情,特……福建十大旅游景点,去过5个就是福建人福建省,简称闽,省会福州。公元733年,从福州、建州各取一字,设立福建经略军使,福建之名自此出现。福建依山傍水,自然条件优越,旅游资源自然丰富。山海一体,闽台同根,民俗奇……内娱,你究竟在高贵什么?车保罗的出现让人们清醒!近段时间在综艺节目《无限超越班》上,一位头戴黑色礼帽,戴大黑框眼镜的老人出镜了。他用他的真诚打动了观众,可却并没有打动在场的演员,实在很让人感觉遗憾,他就是车保罗。车保罗……中国17岁奥运冠军最新照片曝光,身材管理失控,网友胖得太离谱17岁,对于从事竞技体育的职业运动员来说,还可以用小将来形容。毕竟,大多数运动员在这个年龄段只是处于职业生涯的开始。但对于一名去年还在东京奥运会上大放光彩的18岁中国奥运冠军而……人到中年,能够闷声发大财的人,都在做这几件事有人说,人生太漫长,可一眨眼却已经人到中年。回顾过去的几十年好像做了很多事情,但却又总感觉一无所获。在后台几乎每天都有来咨询的年轻人,他们大多都是刚毕业,面对生活的很多不……做好这5件事情,皮肤再黑也能变白据说在夏季,能够击垮我们女人的一句话是:你最近怎么黑了这么多?这句话,太扎心!美白是我们女人一辈子的功课,夏天到了,不光要面部美白,更需要注重身体四肢的美白。穿裙子,短袖……美国运动员分享北京奥运村生活冬奥会的床太高级太惊人了据美国娱乐新闻网站eonline报道,近日,27岁的美国雪橇运动员SummerBritcher在入住北京奥运村后分享了自己的入住体验。她在个人社交平台对粉丝表示有一些不可思议的……8月,4款手机性价比超高,再用三年依旧流畅,目前非常值得入手您在阅读前请点击上面的关注二字,后续会第一时间为您提供更多有价值的相关内容,感谢您的支持。性价比高的手机可以让我们少花钱多办事,花少量的钱就可以买到超高性能的手机,8月份……6位英雄调整同步正式服,扁鹊全线增强,狄仁杰对抗强度直线下降原创兔八哥聊游戏王者荣耀进入9月,就迎来了一次较大的更新,这次的更新不仅上线了多个玩家福利活动,还同步了6位英雄的调整。这6位英雄的调整,其实在体验服还没有获得足够的测试……为什么女生穿比基尼不怕被看,而内衣怕被看?内衣是女性穿在身上的贴身衣物,用来衬托乳房,防止下垂、变形,被称为女性的第二皮肤。内衣不仅仅面料越来越多样化,就连一些设计都越来越疯狂,追求技术产品,纯棉质地已经不再是人……这就是莆田文旅推介会在京举办来源:【中国农网】3月14日,由福建省莆田市委、市政府主办,莆田市文化和旅游局承办的2023这就是莆田(北京)文旅推介会举办。活动着重推介了莆田市特色文化和旅游资源、湄洲……50种孕期叶酸菜谱叶酸含量较高的食物表绿色蔬菜:莴苣、菠菜、龙须菜、花椰菜、油菜、小白菜、青菜、扁豆、豆荚、西红柿、胡萝卜、南瓜、蘑菇等。新鲜水果:橘子、草莓、樱桃、香蕉……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网